토비의 스프링 저자로 유명한 토비님이 인프런에 강의를 만드셔서 수강해봤습니다.

인프런 강의 중 김영한 님의 강의가 실제 실무에 큰 도움이 된 것 같다면, 토비님의 강의는 스프링 부트에 대해 조금 더 깊이 있게 알아보는게 목적이었던 것 같습니다.

기존 강의에서는 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
    • 변경 사항
  • 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 우선 순위를 정할 수 있다

image

위와 같이 설정한 경우 기존 application.properties보다 더 높은 우선순위를 지정할 수 있다.
VM Option > Environment variables > application.properties 순으로 우선순위가 정해진다.

추가 팁

  • gradle 라이브러리 디펜더시 확인

    1
    
    ./gradlew dependencies --configuration compileClasspath
    
  • 스프링 부트 스타터 공식 문서

  • 코드에서 Comaparator.java 인터페이스를 보면 좋다고 함