2024.11.09 - [개발/스프링] - JPA에 관한 단상(1) - N+1 문제의 본질 JPA에 관한 단상(1) - N+1 문제의 본질spring 에서 JPA으로 개발하다보면 누구나 N+1 을 만나게 되어 있다. 사실 Spring에만 있는 것은 아니고 대부분의 ORM에 다 있는 문제이다. 관련해서 키워드로 나오는게 1. JOIN FETCH2. Batch Size3. Eager Loadjongqui.tistory.com 이전 포스팅에선 N+1 문제의 본질에 대해 다루었다.RDBMS와 OOP의 사물을 표현하는 철학이 다르다는 점에 대해서 설명하면서,실제로 문제가 되는 사례를 하나 들어서 설명헀다. 이번 포스팅에서는 백오피스에서 OneToMany 이슈를 어떻게 다뤄야 할지에 대한 내용을 담았다. JPA에서..
spring 에서 JPA으로 개발하다보면 누구나 N+1 을 만나게 되어 있다. 사실 Spring에만 있는 것은 아니고 대부분의 ORM에 다 있는 문제이다. 관련해서 키워드로 나오는게 1. JOIN FETCH2. Batch Size3. Eager Loading , Lazy Loading 등이 있다. 물론 해결책을 아는 것도 좋지만 본질을 이해하지못하면 택도 없는 요구사항을 받았다가,나중에 눈물을 흘리며 기획 수정을 요청해야 하는 경우가 생길 수 있다. N+1의 시작은 데이터를 표현하는 방법에 있어서의 RDBMS와 OOP의 차이에서 기인한다. RDBMS 세계관에서는 각 사물을 테이블로 정의하고,각 사물에 대한 고유성은 PK로 확보하며,개별 사물은 레코드로 표현한다.그리고 사물간의 관계는 FK를 사용해..
이 이슈는 다른 작업을 하다가 뒤늣게 발견했다.spring boot 3.2.2 부터는 RequestParam 어노테이션이나 PathVariable 어노테이션을 사용시 name을 명시적으로 선언해주여야 한다. 기존에는 변수명을 reflection해서 자동으로 매핑해주었는데 해당 구현이 삭제되었다. 아래처럼 플러그인을 통해 대응이 가능하다. org.apache.maven.plugins maven-compiler-plugin true 자세한 설명은 아래 이슈를 참고한다. Upgrading to Spring Framework 6.xSpring Framework. Contribute to spring-projects/spring-framework development ..
타임리프에도 변경사항이 있었다. 가장 대표적인 변화라면, 타임리프에서 session 객체와 request 객체에 직접 접근하던 것을 차단한 것이다. 예를 들어 spring boot 2.2.12에서는 아래와 같은 타임리프 구성이 가능했다. th:with="currentUrl=(${#httpServletRequest.requestURI + '?' + #strings.defaultString(#httpServletRequest.queryString, '')})"> 이제 새로운 버전에서는 #httpServletRequest , session 등, 서블릿 객체에 위와같은 방식으로 접근하는 것이 모두 막혔다. 삭제한 이유는 문서에 명시하지는 않았지만, github 이슈에서 아래와 같이 보안 이슈라고 언급하고 있다...
과거 - WebSecurityConfigurerAdapter 과거 spring security에서는 인증/인가 관련 설정을 위해 WebSecurityConfigurerAdapter 클래스를 상속받아 configure 메서드를 구현해 설정하도록 만들어놨었다. 코드로는 대충 아래와 같이 표현할 수 있다. @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); } } 레거시 코드는 아래와 같은 방식으로 작성했다. (설..
사실 내가 마이그레이션 한 Web Spring Web MVC는 변경이 "거의" 없긴 했다. 아예 없지는 않았다. 요약하면 아래와 같다. 프라퍼티 변경 확장자 매핑 제거 ErrorController 변경 프라퍼티 변경 사실 프라퍼티를 변경하는 것은 크게 어렵지 않다. 왜냐하면, Intellij IDE에서 감지해서 바꾸라고 알려주기 때문이다. spring.resources.* → spring.web.resources.* 삭제된 프라퍼티도 있었다. 확장자 매핑 제거 기존에 아래처럼 excel을 다운로드 받는데 사용하던 코드가 있었다. @Controller public class UserController { @GetMapping("/excel.xls") public String getExcel() { retu..
지금 회사에선 웹앱개발시 jre8 에 spring boot 2.2.12를 사용하고 있다. 시대가 흘러서 LTS 도 종료(사실 원래 1년이긴하다)되고, Azure의 최신 API 지원을 받기도 곤란한 상황이 되어서 결국 업그레이드 결정이 내려졌다. 업그레이드가 결정난 시점에 3.2.2가 최신이어서 그걸 적용하기로 했다. 변경해야할 것들이 굉장히 많다. java8 → java17 변경 pom.xml 수정 javax → jakartaee로 패키지 변경. 톰캣 버전 변경 각종 maven artifiact 버전 변경 httpclient, junit artifact "교체" spring boot 자체의 메이저 버전 변경사항도 있고, 일부 API 지원중단 등 java의 하위호환성이 일부 손실되었기 때문에 위 변화를 적..
타임리프는 스프링 부트의 기본 View 템플릿이다. 일반적으로 Controller에 view를 매핑해주는 방법으로 사용한다. 그러나 개발을 하다보면 코드 내에서 타임리프를 파싱해서 사용하고 싶을 때가 있다. 예를 들어, 스케쥴러 내에서 타임리프로 만든 페이지를 이메일로 발송한다든지 등의 용도가 있다. 그런 경우에 타임리프를 코드 내에서 받아오는 방법에 관한 것이다. 가장 단순한 형태의 타임리프 파서는 아래처럼 만들 수 있다. (참고로 여기에 나오는 Context 객체는 org.thymeleaf.context 패키지 내의 Context 객체이다.) thymeleaf 3.0.6.RELEASE API www.thymeleaf.org public String getTemplate(SpringTemplateEng..
멀티스레드로 요청을 보낸 횟수를 db에 기록해 집계를 할일이 있어서 비관적 락에 대해 좀 살펴보았다. 내가 궁금했던것은 @Lock(LockModeType.PESSIMISTIC_WRITE) 을 어디에 달아주냐였다. 답은 "SELECT 쿼리를 호출하는 메서드" 였다. public interface StatRepository extends JpaRepository { @Lock(LockModeType.PESSIMISTIC_WRITE) StatEntity findStatEntityById(Long id); Optional findyById(Long id); } 인터넷 예시들을 보면 jpql 같은걸 쓰기도 하는데, 그럴 필요 없이 기본 method에선 해당 메서드는 transaction 안에서만 사용해야 한다. ..
회사에서 azure를 사용중인데, 릴리즈 준비중인 prod 서버에서 특이한 문제가 발생했다. (아래 내용은 모두 실제상황과 유사하게 "재현" 및 "각색" 된 것임을 밝힌다.) 스프링 부트 앱에서 google oauth2 인증시에 아래와 같은 에러가 발생했다. 검색해보니 private IP로 접근해서 ouath2 인증이 제대로 되지 않는 이슈였다. 하지만, 난 사내 dns를 통해 url을 입력해 서버에 접근했고 당연히 내부 ip가 사용되면 안되었다. 개발자 툴로 확인해보았다. (보안상 이유로 key값은 모두 지웠다.) Location header 내 쿼리스트링의 "redirect_uri" 의 값에 내부 ip가 찍히고 있었다. 당시에 사내 oauth2 sso 개발자가 휴가 중이었어서 몰랐지만, 로그인 성공후..
- Total
- Today
- Yesterday
- springboot3
- 홈택스
- Request
- springboot
- 알리익스프레스
- Azure
- ouath2
- Thymeleaf
- 오블완
- 티스토리챌린지
- 공익제보단
- n+1
- Java17
- 탈세
- Spring
- 알리
- 포상금
- ORM
- java
- tomcat
- 현금영수증
- 토스페이
- 한국교통안전공단
- 광군제
- 부가가치세
- 전세사기
- 안전신문고
- 이륜차
- k베뉴
- JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |