💡이 포스팅은 토비님의 인프런 강의인 토비의 스프링 부트 - 이해와 원리를 수강하고 학습한 내용을 정리한 포스팅입니다.
토비님의 강의를 수강하며 정리한 GitHub Repository 입니다.
이번 챕터는 Spring을 사용하여 스프링 컨테이너를 추가로 구성하는 방식을 학습합니다.
이번 포스팅에서 정리할 내용은 아래와 같습니다.
- refresh() 메서드 분석
- DI, 인터페이스 사용
- Spring 6, Spring Boot 3 @RequestMapping 이슈
- IntelliJ IDE 단축키 (interface extract & implement)
- Java EE vs Jakarta EE
refresh() 메서드 분석
강의에서 applicationContext 사용 시 refresh() 메서드를 호출하는데, 메서드 주석을 살펴보면 아래와 같이 Java 기반 구성, XML 파일, 속성 파일, 관계형 데이터베이스 스키마 또는 일부 다른 형식일 수 있는 구성을 불러오거나 갱신한다고 되어 있습니다.
이 부분은 추후 포스팅으로 정리 후 링크를 남겨놓도록 하겠습니다.
DI, 인터페이스 사용
보통 Spring에서 DI를 사용할 때 의존 관계를 인터페이스를 기반으로 설계하라고 합니다.
토비님의 스프링 3.1 1권의 620 페이지에도 나와 있고, 여러 번 관련 질문이 올라올 때 인터페이스 사용을 적극 권장하시는 것을 통해서 만약 별다른 이유가 없다거나 인터페이스를 사용한다는 것에 대한 단점을 설명하지 못할 경우에는 토비님이 권장하시는 대로 인터페이스를 기반으로 의존 관계를 설정하는 것이 좋습니다.
DI는 특별한 이유가 없는 한 항상 인터페이스를 사용한다고 기억해두자.
굳이 인터페이스를 써야 하냐고 주장하는 사람을 만났는데 논리적으로 설득할 자신이 없거든 DI는 원래 인터페이스를 쓰게 돼 있다고 우겨도 좋다.
분명한 이유가 있어서 인터페이스를 사용하지 않는 경우가 없지는 않겠지만, 단지 인터페이스를 추가하기가 귀찮아서 약간의 게으름을 부리고자 인터페이스를 생략한다면 이후의 개발, 디버깅, 테스트, 기능의 추가, 변화 등에서 적지 않은 부담을 안게 될 것이다.
(p.620)
Spring 6, Spring Boot 3 @RequestMapping 이슈
토비님의 강의에서는 Sprign 5.7.X, Spring Boot 2.7.X 버전을 사용하지만 Spring 6, Spring Boot 3 버전에서는 수정해야 할 부분이 있습니다.
Controller를 MappingRegistry에 저장하려고 할 때 기존에는 해당 Controller가 Bean이면서 @RequestMapping 애노테이션이 있으면 handler라고 판단해 MappingRegistry에 저장했었습니다.
하지만 Spring 6, Spring Boot 3.0에서는 이 부분이 Bean이면서 @Controller 애노테이션이 있어야지만 handler로 판단해 MappingRegistry에 저장하는 것으로 로직이 변경되었습니다.
Spring 6, Spring Boot 3 이전
Spring 6, Spring Boot 3 이후
이유는 찾아보니 Spring Cloud에 @FeignClient을 아래와 같이 사용하는데,
@FeignClient("")
@RequestMapping(value = "")
public interface UsersClient extends CrudClient<User> {
}
이때 @RequestMapping 애노테이션 때문에 Spring MVC에서 Controller로 판단하여 MappingRegistry에 저장하게 되는데,
@FeignClient를 사용해보지 않아서 잘 모르겠지만 이로 인해 의도치 않은 결과가 발생하는 것 같습니다.
관련해서 찾아본 내용의 출처들입니다. 한 번 참고해 보시면 좋을 것 같습니다.
IntelliJ IDE 단축키 (interface extract & implement)
인텔리제이에서는 다양한 기능들을 제공하는데, 토비님 강의에서 인터페이스를 추출하는 기능을 사용하시는 것을 보고 신기해서 한 번 정리해 봅니다.
저는 반대로 인터페이스의 구현체를 만드는 방법은 알고 있었는데, 같이 정리해 보도록 하겠습니다.
인터페이스 추출 (Extract Interface)
Refactor / Extract interface을 사용하면 되는데 두 가지 방법이 있습니다.
1. Interface 마우스 우클릭 → Refactor → Extract Interface
2. shift 키 두 번 클릭 → Extract Interface 입력
인터페이스 구현 (Implement Interface)
Refactor / Implement interface을 사용하면 되는데 두 가지 방법이 있습니다.
1. alt + enter → Implement Interface
2. shift 키 두 번 클릭 → Implement Interface 입력
Java EE vs Jakarta EE
Spring 6, Spring Boot 3에서 Java EE 대신 Jakarta EE로 사용한다고 합니다.
이에 따라서 javax.* 로 되어 있던 패키징 구조가 jakarta.* 로 변경됩니다.
이유는 Java EE가 이클립스 재단으로 이관되었는데 Java 상표권은 여전히 오라클이 가지고 있기 때문에 사용할 수 없어 Jakarta로 바뀌었다고 합니다.
'Lecture > 토비의 스프링 부트 - 이해와 원리' 카테고리의 다른 글
토비의 스프링 부트 - 자동 구성 기반 애플리케이션 (0) | 2023.02.12 |
---|---|
토비의 스프링 부트 - DI와 테스트, 디자인 패턴 (0) | 2023.02.08 |
토비의 스프링 부트 - 독립 실행형 서블릿 애플리케이션 (0) | 2023.02.02 |
토비의 스프링 부트 - 스프링 부트 살펴보기 ~ 스프링 부트 시작하기 (0) | 2023.01.31 |
토비의 스프링 부트 - 시작하기 (0) | 2023.01.30 |
댓글