(1) [10분 테코톡] 말랑의 스프링 이벤트 - YouTube

 

이벤트를 통해 의존성 개선하기~!

인터페이스에서 이벤트 사용시~!

 

이벤트는 반환 타입이 필요한 경우 사용이 불가능하다.

로직의 흐름이 명확하지 않다.(상황에 따라 장/단이 나타난다.)

 

 

[10분 테코톡] 후니의 스프링 트랜잭션 - YouTube

 

JDBC api는 의존성, 복잡성등의 문제로 스프링 트랜잭션을 이용한다.

동기화, 추상화(Connection, EntityManager, Session )

, 선언적인 기능(@Transactional)으로 나타낸다.(트랜잭션 속성- 하위)

 

isolation~!

(1) [10분 테코톡] 🎃 손너잘의 테스트 코드 최적화 여행기 - YouTube

 

 

 

 

 

read DB와 update , delete DB 따로 구성

 

 

 

 

(1) [10분 테코톡] 🌊 바다의 JUnit5 사용법 - YouTube

 

 

@Disabled - 테스트를 하고 싶지 않음

@DisplaqyName - 어떤 테스트인지 표현

@RepeatedTest - 반복테스트

@PrameterizedTest - 매개변수를 대입해가며 반복 ㅇ실행

@Nested  - 내부클래스 정의,

예외발생을 확인하는 테스트(Assertions)

 

 

(1) [10분 테코톡] 😼 피카의 TDD와 단위테스트 - YouTube

프로그램을 작성하기 전에 테스트~!

TDD(Test-Driven Development) ~!

 

설계 - 테스트코드 - 개발

 

변화에 대한 두려움을 줄여준다, 디버깅 시간을 줄여주고, 동작하는 문서역할

 

TDD를 하면 요구사항에 맞춰 개발하여 오버엔지니어링을 막아준다.

TDD는 설계에 대한 피드백이 빠르다.

좋은단위 테스트 FIRST~!

 

(1) [10분 테코톡] 더즈, 티키의 Classic TDD VS Mockist TDD - YouTube

 

Classic TDD(Fixture :재사용가능) VS Mockist TDD(MOCK :1회로 코드 간결)

 

 

 

 

 

 

 

 

 

 

(1) [10분 테코톡] 제이의 단위 테스트 - YouTube

단위테스트 ~!

given (준비, 값) - when (기능 실행) - then( 결과 검증)

@ParameterizedTest ~! ( n개의 테스트 메서드)

LIST

스프링의 정석 : 남궁성과 끝까지 간다

Spring DI와 AOP

스프링 DI는 파사드 패턴(API 인터페이스),

AOP는 프록시패턴(복제)

 

1. Spring DI

 

하기 코드를 보면 수동으로 car , engine 객체를 호출할수 있으나

하기와 같이 config.txt 파일을 만들어 바로 주입시킬 수 있다.

car=com.fastcampus.ch3.diCopy2.Truck
engine=com.fastcampus.ch3.diCopy2.Engine

 

config.txt를 통해 DI를 쉽게 하는 모습과 car, engine 객체 수동으로 만들어 호출하는 모습이

코드 내에 다 보인다.

package com.fastcampus.ch3.diCopy1;

import java.io.FileReader;
import java.util.Properties;

class Car {}
class SportsCar extends Car{}
class Truck extends Car {}
class Engine {}

public class Main1 {
    public static void main(String[] args) throws Exception {
        Car car = (Car)getObject("car");
        Engine engine = (Engine) getObject("engine");
        System.out.println("car = " + car);
        System.out.println("engine = " + engine);
    }
    static Object getObject(String key) throws Exception {
        Properties p = new Properties();
        p.load(new FileReader("config.txt"));

        Class clazz = Class.forName(p.getProperty(key));

        return clazz.newInstance();
    }

    static Car getCar() throws Exception {
        Properties p = new Properties();
        p.load(new FileReader("config.txt"));

        Class clazz = Class.forName(p.getProperty("car"));

        return (Car)clazz.newInstance();
    }
}

 

하기 그림의 Spring Container는 ApplicationContext라고 보면 되며 Bean 생성 등 BeanFactory를 확장해서 여러기능을 추가 정의

하기 AapplicationContext는 xml과 java 코드로  비교에서 DI를 하는데

자바코드를  더 많이쓴다.

 

Junit Test 에서 DI를 3가지 한 모습

2. AOP

 

하기 코드는 AOP의 기본 

before

코드

after

package com.fastcampus.ch3.aop;

import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AopMain {
    public static void main(String[] args) throws Exception {
        MyAdvice myAdvice = new MyAdvice();

        Class myClass = Class.forName("com.fastcampus.ch3.aop.MyClass");
        Object obj = myClass.newInstance();

        for(Method m : myClass.getDeclaredMethods()) {
            myAdvice.invoke(m, obj, null);
        }
    }
}

class MyAdvice {
    Pattern p = Pattern.compile("a.*");

    boolean matches(Method m){
        Matcher matcher = p.matcher(m.getName());
        return matcher.matches();
    }

    void invoke(Method m, Object obj, Object... args) throws Exception {
        if(m.getAnnotation(Transactional.class)!=null)
            System.out.println("[before]{");

        m.invoke(obj, args); // aaa(), aaa2(), bbb() 호출가능

        if(m.getAnnotation(Transactional.class)!=null)
            System.out.println("}[after]");
    }
}

class MyClass {
    @Transactional
    void aaa() {
        System.out.println("aaa() is called.");
    }
    void aaa2() {
        System.out.println("aaa2() is called.");
    }
    void bbb() {
        System.out.println("bbb() is called.");
    }
}

 

aop는 변경에 유리하게( 관심사 분리)

코드를 before 부가 기능, around (핵심기능), after 부가기능

 

SQL의 join처럼 중복제거 하기위해

횡단 관심사라 할 수 있는 부가기능을 동적으로 추가

 

AOP 관련 용어는 하기와 같고

해당 target 에 부가기능 advice 가 추가되어

proxy target에 advice가 동적으로 추가되어 생성된 객체이다.

핵심기능(join point)들이 시행된다.

 

aop-context 설정 : aop:aspectj-autoproxy 설정 

3. @Transactional

root-context.xml 에서 transactionManager 빈과 tx:annotation:driven

@Transcational 의 속성

LIST

1.Https와 Http 통신규약

(1)Http는 80 포트 Https는 443포트 -> Http+ TLS =Https

(2)텍스트 기반이라 읽고 쉽고 헤더 추가 가능한 형태 이며 클라이언트 정보 저장하지 않는다.

(3)요청 GET  /contextpath/uri  HTTP/1.1

Host : 111.11.11.33:8080

Connection : keept-alive

Cache-Control : max-age=0;

Aceept Encoding :gzip, deflate, br

 

(4) 응답

HTTP1.1 200 OK

Content-Length :22

Content-Type :text/html

Date : Sat, 5 Oct 2021 17:05:05 GMT

<html> <head> <body>

 

2. WAS( Web Application Server) 서비스 구조

 Server(Tomcat) => [ Service <-> Engine(Catalina) ]

server.xml : tomcat 설정파일

web.xml : webapp 공통설정

 

3. 스프링 HTTP요청 

(1) URL에서 해당 도메인(ip,port) 의 서버 컴퓨터에 올라간 프로그램으로 등록된 @Controller 찾음

(2) @RequestMapping 에서 URI 연결후 서비스 요청

 

4. 서블릿과 JSP

요청 ->  DispatcherServlet(1.입력&변환) <-> Controller                -> JstlView(2.모델생성)     -> jsp 응답

                                                     <-> InternalResourceView

                                                        (String , ModelAndView,url매핑)

 

5. MVC  -> 관심사의 분리(입력 , 처리, 출력의 분리) 

 

6. 세션( 서버 저장, 보안 유리, 서버다중화에 불리)

서로 관련된 요청들을 하나로 묶은 것 - 쿠키 이용

브라우저마다 개별 저장소(session 객체)를 서버에서 제공

 

7. 쿠키 (브라우저 저장, 보안불리, 서버 다중화 유리)

이름과 값의 쌍으로 구성된 정보(Domain , URI)

유효기간후 자동 삭제(서버에 요청시 domain,uri가 일치하는 경우에만 자동전송)

 

                                   

 

 

LIST

+ Recent posts