스프링 배치 정리
Back-end/Spring Boot, JPA2024. 4. 27. 19:16스프링 배치 정리

지금까지 알고 있던, 업무상으로 해오던 스프링 배치에 대해 정리했다. 배치란 대량 일괄 작업을 뜻하며 몇 시간에 한번씩 실행되는 등의 스케줄 개념은 포함되지는 않는다.  이점 스프링 웹 MVC와는 달리 스프링 배치를 사용하면 편리한 이유는 아래와 같다.   특정 작업 단위만큼 트랜잭션 처리를 하여 메모리에 한번에 올리는 양이 적기 때문에 OOM으로부터 상대적으로 안전하고 작업에 문제가 있으면 근방에서 다시 시작할 수 있다. (Chunk Oriented)성공한 작업 건에 대해서 실수로 재실행을 하더라도 작업이 수행되지 않는다. (ItemStream)작업을 세부적으로 나누어, 성공/실패시에 어떤 작업을 할 지 쉽게 지정할 수 있다. (Flow)무엇이 잘못되었는지 기본적으로 제공하는 이력 테이블을 통해 쉽게 ..

Quiz! 다음 코드에서 JPA가 실행하는 Query는?
Back-end/Spring Boot, JPA2024. 4. 4. 16:48Quiz! 다음 코드에서 JPA가 실행하는 Query는?

운전 면허를 취득하고 알게된 사실은, 되려 경험이 많은 운전자일 수록 도로 법규나 운전 예절에 대해 망각하는 경우가 종종 있다는 것이었다. 최근 나와 JPA의 관계가 그렇게 되었다는 생각이 문득 들었다. 내 JPA에 대한 실무적인 이해도는 어느 정도일까? JPA나 DB를 개발하는 코어 개발자가 아닌 이상 실무에서 사용하는 기술의 이해도와 응용 능력이 보다 더 중요하지 않을까? 대다수의 개발자는 프레임워크나 라이브러리보다는 현실에 존재하는 특정 도메인에 대해 개발하거나 유지보수를 한다. 그래서 이 글을 보는 여러분들도 필자와 같이 JPA의 동작에 대해 다시 한 번 되짚어 보면 좋을 것이라는 생각이 든다. 퀴즈 자, 아래와 같은 코드가 있다고 하자. 그리고 임의의 컨트롤러가 method1을 호출한다고 가정한..

[땅굴 조사] JPA 트랜잭션이 수행되기까지
Back-end/Spring Boot, JPA2024. 2. 1. 14:03[땅굴 조사] JPA 트랜잭션이 수행되기까지

조사 계기, 트랜잭션 발원지에 대한 궁금증 @EventListener / @TransactionalEventListener (+ @Async 유무)에서 트랜잭션의 동작에 대해 알아보고 있었다 그러가다 아래 트랜잭션 로그의 발원지가 궁금해졌다 로그를 따라가다 보니 친숙한 얼굴들이 보였다 그만 조금만 보고 나온다는게, 끝을 봐보자는 마음으로 살펴보게 되었다 사전 지식 나는 이미 어느 정도 코드의 내막을 알았지만 처음 본 사람은 어려울테니, 알게된 내용을 미리 정리했다 이걸 보고 들어가면 코드를 읽어나가기 좀 더 수월할 것이다! TransactionAspectSupport (org.springframework.transaction.interceptor) 스프링의 AOP 기능으로 트랜잭션을 처리해주는 역할 실제..

Spring Data Repository 확장 (짧음)
Back-end/Spring Boot, JPA2023. 12. 13. 02:35Spring Data Repository 확장 (짧음)

종종 Spring Data 스택을 사용하다 보면 어떤 Entity Repoistory 던간에 자주 사용하는 기능이 나오기 마련이다 나의 경우 토이를 할때 Kotlin을 자주 사용하는데 ID에 의한 찾은 값의 반환타입이 Optional 보다는 nullable Entity 인게 편한 경우가 많았다 왜냐하면 Elvis Operator를 사용하는게 보다 간단하다고 생각했기 때문이다 val notNullObject = nullableObject ?: throw RuntimeException("null이 될 수 없습니다.") 이때 사용하면 좋은 심플한 트릭이다 Spring Data Repository 확장하기 확장할 Repository에서 구현하고자 하는 메서드만 기술한다 interface ExtendedCrudR..

Thread Safe하게 처리해보자 (feat. synchronized , 낙관, 비관, named)
Back-end/Spring Boot, JPA2023. 6. 27. 01:46Thread Safe하게 처리해보자 (feat. synchronized , 낙관, 비관, named)

정합성 보장 WAS 여러대에서 정합성 보장 쓰기 DB가 여러대에서 정합성 보장 실행 속도 (실험) 작업 순서 처리 보장 동시성 고려 X X X X 1m 1s X synchronized X X X 4m 56s O 비관적 락 O O X 4m 32s O 낙관적 락 O O (#1) X 1m 5s X Redisson 락 O O O 4m 44s O #1 : 해줄 것으로 생각됨 동시성 고려를 하지 않은 경우 아래 이미지처럼 기대 예약 개수인 250개 보다 많은 366건이 예약됨을 알 수 있다 동시성 처리를 위해 synchronized를 사용한 경우 @Transactional synchronized public long bookPerformance(...) { //공연 예매 로직 } synchronized 위치가 저기..

ArgumentResolver처리 과정 + Spring Web MVC 흐름
Back-end/Spring Boot, JPA2023. 6. 20. 21:00ArgumentResolver처리 과정 + Spring Web MVC 흐름

전에 작성한 글이 길어져서, 포스팅을 분리했다 동작 흐름 ArgumentResolver는 아래와 같은 순서로 호출된다 Handler의 각 Parameter 리스트 순회한다 Argument Resolver 리스트를 순회하면서 1번의 Parameter의 타입에 일치하는 것을 찾는다 즉 O(N^2)이다 InvocableHandlerMethod 를 보도록 하자 (HandlerMethod의 자손) 먼저 파리미터들 목록을 가져온다 그 후 arguemntResolver들의 목록을 순회한다 언제 ModelAttributeMethodProcessor를 거치는가 결론: 커스텀 클래스인 모든 경우. (단, 커스텀 클래스에 대응하는 ArgumentResolver가 없는 경우) 먼저, 들어가기전에 간단히 알고 넘어갈 게 있다 ..

Argument Resolver 등록 관련 디버깅 (feat. Spring MVC 흐름)
Back-end/Spring Boot, JPA2023. 6. 20. 20:33Argument Resolver 등록 관련 디버깅 (feat. Spring MVC 흐름)

결론: ArguemntResolver를 WebMvcConfigurer에 등록하지 않음 이글을 쓰는 이유는 MVC에 대한 이해도가 다소 높아진 게기가 되어서 작성했다 알게 된 바에 의하면 웹 요청이 있으면 Dispatcher Servlet -> Interceptor 목록 순회 -> Handler Adapter -> ArgumentResolver -> Handler (Controller 위와 같은 순서로 진행이 된다 조금 더 상세히 얘기하면 Dispatcher Servlet 를 거친 후 해당 요청 URL에 대한 Interceptor 목록을 순회한 후 Handler Adapter 목록을 조회 (대부분의 경우 RequetMappingHandlerAdapter)후 이동할 Handler에 대한 Argument목록 ..

p6spy로 로그 포맷팅
Back-end/Spring Boot, JPA2023. 6. 16. 15:25p6spy로 로그 포맷팅

JPA 로그를 보다보면 select ~ from 테이블 where col1 = ? and col2 = ? 로 포맷팅 되지 않은 형태로 sql 로그가 찍히는 걸 볼 수 있다 1. 개행 없음 2. 바인딩 되는 파라미터 정보 부재 spring data jpa 기능으로만 위 1, 2 문제는 해결이 가능하다, 그러나 select ~ from 테이블 where col1 = ? and col2 = ? ~ binding parameter ['1'] ~ binding parameter ['philz'] 로 파라미터와 sql로그가 따로 찍혀서 불편하게 해석해야 한다 따라서 p6spy를 이용하면 저 물음표 자리에 파라미터 정보를 넣어서 편하게 볼 수 있다 select ... from 테이블 where col1 = '1' a..

Spring Boot 3.x에서 H2 DB 설정
Back-end/Spring Boot, JPA2023. 5. 12. 00:10Spring Boot 3.x에서 H2 DB 설정

최근에 H2 DB를 사용하면서 복습겸 알게된 사실이 있어서 간단히 작성했다 먼저 스프링 부트 3.x 기준으로 더 이상 이전 버전의 H2를 설정할 수 없다 강의를 보며 MSA 프로젝트 진행 중, 기존 방식대로 되지 않아서 H2를 서버모드로 바꾸어서 진행했다 H2의 두 가지 모드:: Embed, 서버 모드 H2에는 Embed(내장)과 서버 모드가 있는데 Embed은 스프링 부트에 포함된 H2를 돌리는 것이고 서버모드는 직접 H2를 수동으로 실행한 후에 스프링 부트를 실행해서 접근해서 사용하는 방식이다 서버모드는 Embed와 달리 서버를 중단시켜도 데이터가 휘발되지 않는다 서버모드를 사용하기 위한 과정은 아래와 같다 1. H2를 실행 2. H2 Embed 설정으로 실행한후 서버 종료 3. H2 서버 모드로 실..

spring security
Back-end/Spring Boot, JPA2021. 5. 5. 22:51spring security

whitesheep 백기선님 강의 정주행중.. Password history 부분을 읽고 있다. docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#core-services-password-encoding Spring Security Reference The authenticator is also responsible for retrieving any required user attributes. This is because the permissions on the attributes may depend on the type of authentication being used. For example, if binding..

newlecture: spring MVC 1
Back-end/Spring Boot, JPA2021. 4. 26. 22:45newlecture: spring MVC 1

아래 주소로 옮겼어요 ! newlecture: spring MVC 1/4 (velog.io) newlecture: spring MVC 1/4 https://youtu.be/JM1PX5xFw-g우선 뉴렉쳐쌤.. 항상 감사합니다 !Tomcat에서 진행되었던 Servlet, Mybatis 설정등이 Spring으로 옮겨졌다.사용자로부터 받는 요청을 DIspatcherServlet이 중간에서 교통정리를 한다 velog.io

newlecture: spring AOP (ft.빵또아)
Back-end/Spring Boot, JPA2021. 4. 24. 22:32newlecture: spring AOP (ft.빵또아)

www.youtube.com/watch?v=y2JkXjOocZ4&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=19 항상 감사합니다 뉴렉쳐 쌤 !! AOP는 마치 빵또아와 같다. 개발을 하다보면 사용자를 위한 주 업무 로직 이외에, 개발자와 운영자를 위한 로직이 같이 생긴다!!! 뚜둥 ! ㅃ빵또앟ㅎ !! 각 주 업무 로직마다 로그, 보안, 트랜잭션 처리를 해야 하는데, 각 로직마다 호출했던 저 일들을 AOP가 관리를 해준다. 앞 뒤 관련 처리를 하나의 장소 안에서, 주 업무 로직을 호출하는 방식으로 처리하기 때문에 해당 로직들은 모두 로그, 보안, 트랜잭션 처리를 하는 것처럼 보인다. 이모습이 마치 빵또아를 보는 것과 비슷하다. 구체적으로는 proxy를 통해서 호출할 ..

image