토비의 스프링 저자로 유명한 토비님이 인프런에 강의를 만드셔서 수강해봤습니다.
인프런 강의 중 김영한 님의 강의가 실제 실무에 큰 도움이 된 것 같다면, 토비님의 강의는 스프링 부트에 대해 조금 더 깊이 있게 알아보는게 목적이었던 것 같습니다.
기존 강의에서는 Spring Boot 2.7과 jdk 11로 했지만 학습 코드는 Spring Boot 3.1.1과 jdk 17로 적용해서 클론 코딩 을 진행하며 버전이 달라지면서 발생한 문제와 팁을 정리했습니다.
강의에서 나온 프로그램 추천
sdkman : jdk 및 여러 sdk들의 버전을 쉽게 변경할 수 있도록 해준다.
Wrap : AI가 내장된 터미널(다양한 기능 있음)
httpie : 터미널에서 간단한 api 응답 요청이 가능하다.
1
http -v ":8080/hello?name=Spring
Code Style은 intellij-java-google-style.xml
로 적용했습니다.
관련 링크
입니다.
강의 클론 코딩 중 발생한 이슈
버전이 달라서 발생한 문제
spring boot 3.1.1을 적용하면서
@RequestMapping
이 있어도 스프링 컨트롤러로 인식하지 않는 현상이 있습니다.@RestController
,@Controller
애노테이션이 있어야 스프링 컨트롤러로 인식합니다.- 스프링 boot 3.0부터는 클래스 레벨의 핸들러 감지 대상이
@Controller
만 포함 됨 - Github Issue
- 변경 사항
- 스프링 boot 3.0부터는 클래스 레벨의 핸들러 감지 대상이
API를 통한 테스트 중 port가 안맞는 문제
1 2
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:8080/hello": Connection refused ...
와 같은 에러 발생하여 테스트 클래스 상단에
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
어노테이션 추가 -> 관련 링크jetty를 config로 지정할 때 아래와 같은 에러가 발생한 경우
1 2 3 4 5
... at tobyspring.helloboot.HelloBootApplication.main(HelloBootApplication.java:15) ~[classes/:na] Caused by: java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpSessionContext at org.eclipse.jetty.servlet.ServletContextHandler.newSessionHandler(ServletContextHandler.java:339) ~[je ...
spring-boot-starter-jetty 의존성 관련된 문제로 판단된다. Spring Boot 3에서는 Jakarta Servlet 6.0.0이고, spring-boot-starter-jetty는 Jakarta Servlet 5.0.0이라 발생하는 문제로 판단 일단 해결하기 위해서
build.gradle
에 종속성 하나를 더 추가 했었습니다.1
implementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '11.0.15'
조금 더 찾아보니 스프링부트에 이슈 로 있으며,
build.gradle
에서1
ext['jakarta-servlet.version'] = '5.0.0'
를 명시적으로 써주면 된다고하여 수정했습니다.
버전이 안맞는 문제 링크
Hikari-cp 설정이 잘안되는 현상
1
implementation('com.zaxxer:HikariCP:4.0.3') // 이렇게 하니 잘됨..
환경 설정을 통해 env 우선 순위를 정할 수 있다
위와 같이 설정한 경우 기존 application.properties
보다 더 높은 우선순위를 지정할 수 있다.
VM Option > Environment variables > application.properties 순으로 우선순위가 정해진다.
추가 팁
gradle 라이브러리 디펜더시 확인
1
./gradlew dependencies --configuration compileClasspath
코드에서
Comaparator.java
인터페이스를 보면 좋다고 함