9월의 첫 하루!
둘 다 내부적으로 @Component가 붙어 있는 어노테이션이라, 스프링이 리플렉션으로 이 둘을 인식해서 객체 생성을 대신 관리해준다는 점은 같다.
@Mapper 붙은 인터페이스는 메서드 명세만 있고 구현이 없다. 실제 SQL은 별도 XML 파일에 있고, namespace로 인터페이스와 연결되고, id 속성이 메서드 이름과 매칭된다. #{email}이라고 쓰면 SQL 실행 시점에 전달받은 객체의 getEmail() 메서드가 호출되고, 그 반환값이 쿼리 파라미터 자리에 들어간다. 이 XML에서 실수하기 쉬운 지점은 맨 윗줄이다. <?xml version...?> 선언 앞에 빈 줄이나 공백이 하나라도 있으면 파싱 자체가 실패한다.
객체 생성과 관리 권한을 개발자가 아니라 프레임워크(컨테이너)가 갖는 것이 IoC다. 이걸 실현하는 방법이 DI(의존성 주입)와 DL(의존성 조회)인데, Spring이 제공하는 DI 어노테이션으로는 @Autowired(타입 기준), @Resource(이름 기준), @Qualifier(같은 타입이 여럿일 때 지정), @Inject가 있다. 최근에는 생성자 주입이 권장 방식인데, Lombok의 @RequiredArgsConstructor를 쓰면 final 필드를 받는 생성자를 자동으로 만들어줘서 직접 타이핑할 필요가 없어진다.
@SpringBootTest를 붙인 테스트 클래스에서, 먼저 테스트 데이터를 만들고 그 데이터로 실제 로직을 실행한 다음 결과가 기대한 값과 같은지 Assertions로 비교하는 3단계로 테스트 코드를 짠다. 인터페이스인 Mapper도 @Autowired로 주입받아 테스트할 수 있는데, 컨테이너가 프록시 객체를 만들어서 관리하기 때문이다.
같은 인터페이스(예: UserService)를 여러 구현체가 구현하고, @Service(value = "이름")으로 Bean 이름을 지정해두면, 컨트롤러에서 @Resource(name = "이름")으로 원하는 구현체만 골라 주입받을 수 있다. 나중에 구현을 통째로 바꿔도 인터페이스 타입은 그대로라 호출부 코드를 고칠 필요가 없다.
#LGCNS #LGCNS6기 #개발자 #LGCNSINSPIRECAMP