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 ..
요청을 XSS escape하는 것을 도와주는 오픈소스 API가 몇개 있다. 1. commons-text org.apache.commons commons-text 1.11.0 commons-text의 경우엔 아파치 재단에서 만든 "String 처리"를 위한 API를 모아놓은 artifact이다. xsx escape 만을 위한 도구는 아니지만, 여기에도 xss escape를 위한 API가 있다. org.apache.commons.text.StringEscapeUtils#escapeHtml4(String input) 이 그 주인공이다. static method이기 때문에 그냥 쓰면 된다. 이 메서드는 우리가 흔히 아는 "" "\"" , "\'" 등의 문자열을 escape 해서 공격을 막는다. 사실 원래는 An..
지난 포스팅에선 spring용 azure storage api의 스타터에 대해 살펴보았다. 1개의 blob 저장소만 사용한다면 매우 유용하겠지만, 안타깝게도 보통 1~2개정도의 blob은 쓰기 마련이다. 이제 starter를 제외한 azure java sdk로 구현을 해보자. 먼저 artifact는 2개가 필요하다. com.azure azure-storage-blob 12.25.2 com.azure azure-identity 1.11.4 azure-storage-blob 은 저장소를 다루기 위한 용도이고, azure-identity는 저장소에 업로드하기 위해 인증할 때 사용할 용도이다. (로그인에 connection string을 사용하는 경우엔 azure-identity가 필요 없다.) azure sd..
spring boot 2.2.2 를 개발하던 당시, 사용하던 sdk는 완전 "구렸다". (다른 게시글에서 2.2.12라고 했었는데, 중간에 버전을 변경한 것이다) API는 너무 자주바뀌었으며, 겉멋이 든 것 같은 구현이 꽤 많았다. 가장 큰 문제는 레거시 문서를 꽁꽁 숨겨놓는다는 것이다. (이 부분에 대해 개인적인 불만이 아주 크다) 지금 개발하고 있는 앱들에 적용된 버전은 azure storage 8.4(이하 v8) azure storage 11.0.0 (이하 v11) 2개였다. v8의 경우엔 다른 개발자 분이 wrapping해서 Bean으로 주입해 blob 리소스에 대해 CRUD 기능을 사용할 수 있게 구현해놓았다. v8 자체가 사실 Azure Credential을 통한 인증 부분 말고는 그렇게 복잡..
타임리프에도 변경사항이 있었다. 가장 대표적인 변화라면, 타임리프에서 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의 하위호환성이 일부 손실되었기 때문에 위 변화를 적..
- Total
- Today
- Yesterday
- k베뉴
- JPA
- 부가가치세
- ORM
- 이륜차
- java
- 한국교통안전공단
- 오블완
- 티스토리챌린지
- 알리
- 토스페이
- springboot3
- 탈세
- Request
- Azure
- 포상금
- 안전신문고
- 광군제
- 알리익스프레스
- Thymeleaf
- 현금영수증
- Java17
- 홈택스
- springboot
- tomcat
- Spring
- 공익제보단
- 전세사기
- ouath2
- n+1
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |