본문 바로가기
Spring

스프링 환경설정 셋팅

by asdft 2024. 4. 18.

1. Build and run using,  Run tests using 2개의 값을 IntelliJ IDEA로 변경하면

인텔리제이가 직접 자바 프로젝트를 실행하고, 조금 더 빨리 로드됩니다.

 

2. 스프링 부트 3.2부터 자바 컴파일러에 -parameters 옵션을 넣어주어야 애노테이션의 이름을 생략할 수 있다.

주로 아래의 애노테이션을 사용할 때 문제가 발생한다.

@RequestParam, @PathVariable, @Autowired, @ConfigurationProperties

 

해결 방안1)

애노테이션에 이름을 생략하지 않고 다음과 같이 이름을 항상 적어준다.

@RequestParam("username") String username

@PathVariable("userId") String userId

 

해결 방안2)

컴파일 시점에 -parameters 옵션 적용

1. IntelliJ IDEA에서 File -> Settings를 연다. (Mac은 IntelliJ IDEA -> Settings)

2. Build, Execution, Deployment → Compiler → Java Compiler로 이동한다.

3. Additional command line parameters라는 항목에 다음을 추가한다.

-parameters

4. out 폴더를 삭제하고 다시 실행한다. 꼭 out 폴더를 삭제해야 다시 컴파일이 일어난다.

 

해결 방안3(권장)

Gradle을 사용해서 빌드하고 실행한다.

 

문제 원인

참고로 이 문제는 Build, Execution, Deployment -> Build Tools -> Gradle에서

Build and run using를 IntelliJ IDEA로 선택한 경우에만 발생한다.

Gradle로 선택한 경우에는 Gradle이 컴파일 시점에 해당 옵션을 자동으로 적용해준다.

자바를 컴파일할 때 매개변수 이름을 읽을 수 있도록 남겨두어야 사용할 수 있다. 컴파일 시점에 -parameters 옵션을 사용하면 매개변수 이름을 사용할 수 있게 남겨둔다.

스프링 부트 3.2 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도했다. 하지만 스프링 부트 3.2 부터는 이런 시도를 하지 않는다.

// 정상 작동
@PutMapping("/restaurant/{restaurantId}")
  public ResponseEntity<Object> getSingleRestaurant(
      @PathVariable("restaurantId") @Min(1) Long restaurantId,
      @RequestBody ModifyRestaurantRequestDto modifyRestaurantRequestDto,
      @AuthenticationPrincipal UserDetails userDetails
  ){}

 

// 오류 발생
@PutMapping("/restaurant/{restaurantId}")
  public ResponseEntity<Object> getSingleRestaurant(
      @PathVariable @Min(1) Long restaurantId,
      @RequestBody ModifyRestaurantRequestDto modifyRestaurantRequestDto,
      @AuthenticationPrincipal UserDetails userDetails
  ){}

 

관련내용참고

https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit?pli=1

 

자주 하는 질문

 

docs.google.com