TIL - #15 리팩터링

Quann·2022년 12월 28일
2

00. 개요.

커뮤니티 (게시판 CRUD) 프로젝트를 혼자서 진행하며, 항상 눈에 거슬리던 것이 있었다.
바로 서버를 돌릴때 콘솔 로그창에 뜨는 WARN 메세지였는데, 오늘은 이를 리팩토링 하고자 했다.
리팩토링 하는 과정에서 배우는 것이 많을 것이라 생각했다!


01. 문제의 발견

WARN 56685 --- [main] org.hibernate.orm.deprecation: HHH90000021: Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.sharedCache.mode] instead
WARN 56685 --- [main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
WARN 56685 --- [main] o.s.s.c.a.web.builders.WebSecurity: You are asking Spring Security to ignore org.springframework.boot.autoconfigure.security.servlet.PathRequest$H2ConsoleRequestMatcher@3d0ce151. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.

서버를 돌리면, 다음과 같이 3가지 종류의 WARN 코드가 발생했다.
서버가 돌아가기는 하지만, WARN이 뜬다는 것은 경고를 주는 것이기 때문에 이를 해결해보고자 노력했다.


02. 문제의 해결

02.1. javax.persistence.sharedCache.mode

문제의 로그 메세지를 보자.
에러를 마주치거나, 경고를 마주쳤을 때 사실 메세지만 제대로 읽어도 문제를 파악하기 매우 용이해진다. 천천히 메세지를 읽고 이해하고, 어떤 부분이 문제인 것 같은지 흐름을 짚는 습관을 기르자

Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.sharedCache.mode] instead

대충, javax.persistence.sharedCache.mode 가 deprecated 되었으니, jakarta.persistence.sharedCache.mode를 써다는 말 같다.

근데, 전체 검색을 해보아도 내 프로젝트 내부 코드에서도 사용한 적이 없거니와, 외부 라이브러리에서도 해당 부분에 관련된 문제점은 찾아볼 수 없었다. 그래서 검색을 해보니,

https://github.com/spring-projects/spring-data-jpa/issues/2717
에서 다른 외국 분이 똑같은 이슈를 던졌고, 이에 대한 해답을 참고했다.

spring:
  jpa:
    properties:
      jakarta:
        persistence:
          sharedCache:
            mode: ALL

로 설정해주었다
JPA에서 엔티티를 관리할때 Caching 하는 기법을 설정해주는 부분인데,
스프링 3.0.0 버전을 사용하면서 추가된 코드 같다.
jakarta 관련 이슈인 것 같은데, 엔티티와 엔티티와 관련된 데이터들을 캐싱하기 위해 ALL로 설정해주었다.

02.2. spring.jpa.open-in-view

문제의 로그 메세지를 보자.
JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning

대충, spring.jpa.open-in-view가 default로 활성화 되어있는데, 이때 view rendering 동안 db쿼리가 동작하니까(성능 이슈가 생기나 보다), WARN 메세지 없애려면 명시적으로 disable 하라는 뜻 같다.

spring:
  jpa:
    open-in-view: false

로 설정해주었다

02.3. SecurityConfig - PathRequest

또 문제의 로그 먼저 읽자!
You are asking Spring Security to ignore org.springframework.boot.autoconfigure.security.servlet.PathRequest$H2ConsoleRequestMatcher@3d0ce151. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.

webSecurityCustomizer() 메서드에서, ignore할 부분들을 설정해줬는데, 해당 부분에서는 H2ConsoleRequestMatcher 같이 Enum 타입으로 해당 URL Pattern을 설정해주고 있었다. 그런데, WARN 메세지에서 web.ignore로 패턴을 설정해주는 것이 아니라, HttpSecurity#authorizeHttpReqeuests 통한 permiAll 을 쓰는 것을 권장하고 있었다.

원래 쓰던 Enum 타입을 찾아 들어가서, 해당 path들을 찾아와, requestMatchers에서 해당 링크를 permitAll 해주자 ~

.requestMatchers("/css/**", "/js/**", "/images/**", "/webjars/**", "/favicon.*", "/*/icon-*").permitAll()
.requestMatchers("/h2-console", "/h2-console/**").permitAll()

03. 결론과 생각

결국, WARN 메세지 없는 깔끔한 서버 콘솔창이 완성되었다.
매우 보기 좋다.

경고를 해결하는 과정에서
1. 공식 Spring Data JPA 깃허브에서 올라온 Issue도 확인하고
2. Hibernate 공식 문서도 확인해보고
3. 어떤 문제가 있어서 WARN을 던지는지 이유도 파악해보고
4. 영어도 번역해보고
5. 경고 코드 보고, 내부 코드 타고들어가면서 docs 확인하면서

많은 것을 배웠다.

다른 사람 눈에는 별 거 없을 수 있지만, 에러 코드를 잡아내고 공식 문서를 확인하면서 앞으로 이러한 문제를 마주쳤을 때 해결 통로를 하나 발견한 느낌이다.
또, 그냥 조금 더 잘해진 것 같아 기분이 좋았다.
영어로된 공식문서 확인하면서 경고들을 해결하니 진짜 개발자가 된 것 같았다


04. 오늘의 한 문단

에러 메세지야 고마워

참고 자료:
https://github.com/schauder/issue-jpa-2717-sharedpersistence-warning
https://mand2.github.io/spring/spring-boot/1/

profile
코드 중심보다는 느낀점과 생각, 흐름, 가치관을 중심으로 업로드합니다!

0개의 댓글