본문 바로가기

프로그래밍/Spring23

[Spring + Jackson] Spring Boot에서는 왜 FAIL_ON_UNKNOWN_PROPERTIES default 옵션을 false로 사용하는가 ? 안녕하세요. 이전 포스팅 [Spring + Jackson] Spring Boot에서 default ObjectMapper의 configuration을 알아보도록 하자에서 Spring Boot에서는 jackson을 사용할 때 default ObjectMapper를 기본적으로 사용하지 않고 커스텀하여 사용한다고 말씀드렸습니다. 관련하여 왜 이런 결정을 내렸는지에 대한 이야기를 전달받아서 이를 추가 포스팅으로 작성해 보았습니다. Spring Boot에서 FAIL_ON_UNKNOWN_PROPERTIES 설정값을 false로 기본 설정 해당 결정에 대한 Issue가 Spring-Framework의 github Issue로 2014년 6월 20일 등록 되어있었습니다. 해당 이슈에 대한 논의는 지금으로부터 8년전에 .. 2022. 10. 3.
[Spring + Jackson] Spring Boot에서 default ObjectMapper의 configuration을 알아보도록 하자 안녕하세요. ObjectMapper를 기본적으로 선언해서 사용하면 FAIL_ON_UNKNOWN_PROPERTIES 옵션이 켜져있기 때문에 잘못된 RequestBody이 Fields가 들어오면 에러를 냅니다. 그런데 Spring Boot 기본 ObjectMapper를 사용하면 에러를 내지 않고 정상 동작합니다. 어째서 일까요? Spring Boot AutoConfiguration에 의해서 자동으로 ObjectMapper를 커스터마이징해서 사용하기 때문입니다. 그렇다면 Spring Boot의 ObjectMapper에 대한 기본 세팅은 어떻게 될까요? 오늘은 코드를 따라가보며 그 세팅을 찾아보도록 하겠습니다. 시작점 찾기 intellij IDE를 이용하면 빠르게 어떤 objectMapper를 사용하는지 파악할.. 2022. 9. 20.
[JPA] Spring JPA 환경에서 bulk insert를 효율적으로 해보자 - JPA의 한계와 JDBC 활용 안녕하세요. 오늘은 Spring JPA 환경에서 bulk insert를 효율적으로 하는 방법에 대해서 알아보는 시간을 가져보도록 하겠습니다. JPA를 사용하고 ID를 전략을 사용했을 때 JPA의 성능 문제는 이전에 [JPA] JPA의 AUTO_INCREMENT 테이블에서 다건 insert 시간 비교 - save vs saveAll 포스팅에서 간단히 다룬적이 있습니다. 해당 포스팅의 주된 내용은 save와 saveAll의 성능 시간 비교였지만 연관이 있으므로 관심있으신 분들은 해당 포스팅을 일부 참고하셔도 좋을 것 같습니다. Spring Data JPA의 bulk insert와 그 한계점 bulk insert는 한번의 쿼리로 여러건의 데이터 row를 insert할 수 있는 insert 방법입니다. batc.. 2022. 4. 12.
[Spring] problem spring web을 이용해 Exception Hadling을 단순화해보자 - MVC 편 안녕하세요. 오늘은 spring에서의 exception handling을 쉽게 사용할 수 있게하는 problem-spring-web 라이브러리를 사용해 보도록 하겠습니다. 오늘 포스팅에서는 Web MVC와 Webflux를 모두 알아보도록 하겠습니다. application/problem+json 알고 있으셨나요 ? 저는 몰랐습니다. http 에러 응답을 json으로 상세하게 반환하는 별도의 Http MediaType이 존재하는 사실을. 이 MediaType의 이름은 application/problem+json입니다. application/problem+json 스키마의 설명은 아래와 같습니다. 새로운 오류 응답 형식을 정의할 필요를 피하기 위해 RFC에서 정한 규약중 하나입니다. 무조건 이런 규약을 따라야.. 2022. 2. 26.
[Spring] @Async에서 사용하는 ThreadPoolTaskExecutor 최적화하기 오늘은 Spring MVC에서 쉽게 비동기 프로그래밍을 할 수 있는 @Async 을 튜닝하는 방법에 대해서 알아보도록 하겠습니다. 오늘 코드는 Java가 아닌 코틀린으로 작성되었습니다. Java 로도 충분히 작성하실 수 있으니 천천히 따라오시면 됩니다. :) @Async Spring MVC 에서 간단하게 병렬프로그래밍을 구현할 때 @Async 어노테이션을 많이 이용합니다. 이 어노테이션을 메서드에 붙이기만하면 간단하게 사용할 수 있기 때문에 많이 사용하곤 합니다. 아래 코드가 사용의 예시입니다. @Async fun sendCloudMessage(event: Event) { fireBaseSuspendApi.sendCloudMessage(id = event.id); } 하지만 이런 어노테이션으로 간단하게 .. 2022. 2. 19.
[Spring Boot] package(패키지)의 역할과 archUnit를 이용하여 구조 정립하기 안녕하세요. 오늘은 객체지향에서 package의 역할과 archUnit을 이용하여 정립한 패키지 구조에 대해서 제대로 사용할 수 있도록 제한하는 방법에 대해서 알아보도록 하겠습니다. 패키지(package)의 역할 패키지는 단순하게 말하면 클래스를 위치시키는 디렉토리의 역할을 할 수 있습니다. 클래스는 패키지 아무곳이나 아무렇게 위치를 시켜도 될까요? 기능적으로 안되진 않습니다. 하지만 이렇게 했을 때 괜찮을까요? 개인의 PC에 사용하는 파일을 폴더에 위치시킬때를 생각해봅시다. 파일들을 아무 디렉토리에 두신 경험이 있으시죠? 그럴때 다시 찾고자 할때 찾기 쉬우셨나요? 어렵습니다. 그래서 우리는 파일들도 디렉토리를 나누어서 정리하여 사용합니다. 코딩의 경우는 어떨까요? 코딩은 혼자 하는 일이 아닙니다. 그렇.. 2021. 12. 26.
[JPA] JPA의 AUTO_INCREMENT 테이블에서 다건 insert 시간 비교 - save vs saveAll 안녕하세요. 오늘은 JPA에서 auto_increment 테이블에 bulk insert를 지원하지 않는 이유에 대해서 알아보도록 하겠습니다. 그리고 JPA를 이용해서 다량의 데이터를 넣어보고 각 insert가 완료되기 까지의 시간을 확인해보는 포스팅을 진행하도록 하겠습니다. 또한 왜 이런 상대적인 결과가 나왔는지도 알아보도록 하겠습니다. JPA와 bulk insert, 그리고 IDENTIFY 일반적으로 RDBMS에서는 bulk insert라고 하여 한번의 쿼리로 여러건의 데이터를 insert 할 수 있는 기능을 제공해주고 있습니다. 이런 bulk insert 쿼리를 이용하면 한번의 쿼리로 여러건의 데이터를 한번에 insert 할 수 있기 때문에 데이터베이스와 어플리케이션 사이의 통신에 들어가는 비용을 줄.. 2021. 9. 24.
[Spring] Spring의 Event를 어떻게 사용하는지에 대해서 알아봅시다. - @TransactionalEventListener에 대해서 안녕하세요. 오늘은 Spring의 Event의 2번째 시간으로 @TransactionalEventListener에 대해서 알아보는 시간을 가져보도록 하겠습니다. 이전 포스팅에서는 Spring에서 Event란 무엇이며 기본적인 구현에 대해서 알아보았습니다. 이쪽은 [Spring] Spring의 Event를 어떻게 사용하는지에 대해서 알아봅시다 포스팅을 참고해주시기 바랍니다. @TransactionalEventListener Event를 사용할 때 기본적으로 사용하는 @EventListener는 event를 publishing 하는 코드 시점에 바로 publishing합니다. 그런데 우리는 event를 퍼블리싱 할때는 대부분 메인 작업이 아닌 서브의 작업이 많고 비동기로 진행해도 되는 경우도 많습니다. 다른.. 2021. 8. 23.
[Spring + JPA] jpa에서 Repository를 이용한 비관적락을 구현해봅시다. With MariaDB 안녕하세요. 오늘은 이전 시간에 이어서 비관적락을 JPA를 통해 이론적인 부분과 이를이용하여 구현하는 방법, 그리고 도출되는 쿼리를 알아보도록 하는 시간을 가져보도록 하겠습니다. 비관적 락 비관적락은 내가 접근하고 하는 Database 리소스에 다른사람이 접근조차 하지못하도록 락을 걸고 작업을 진행하는 것을 말합니다. 물론 여기서 접근이라는 것은 READ 작업과 WRITE 작업이 분할되어 있습니다. 경우에 맞춰 둘다 불가능할지 아니면 하나만 가능할지를 정하는것이 가능합니다. 비관적락을 사용할 때 2가지 옵션을 선택할 수 있습니다. 배타락(exclusive lock)과 공유락(shared lock)입니다. 공유락을 걸면 다른 트랜잭션에서는 읽기는 가능하지만 쓰기는 불가능힙니다. 베타락에서는 다른 트랜잭션에.. 2021. 8. 16.
[JPA] jpa에서 Repository를 이용한 낙관적락을 구현해봅시다. 안녕하세요. 이전 시간에 저희는 [database] 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock) 포스팅에서 낙관적락과 비관적락의 이론에 대해서 알아보았었습니다. 오늘은 이어서 Spring의 JPA에서 낙관적락을 구현하는 방법과 결과에 대해서 알아보는 시간을 가져보도록 하겠습니다. 환경설정 오늘의 테스트를 진행하기 위해서는 Spring과 JPA의 설정이 필요합니다. 해당 설정에 대한 부분은 생략하도록 하겠습니다. 만약 빌드도구로 gradle kotlin dsl 을 이용하신다면 [kotlin + Spring] 코틀린, Spring Boot 환경에서 JPA 사용하기, plugin과 함께를 참고해주시면 좋을것 같습니다. 테스트 Entity 오늘 테스트를 도와줄 Entit.. 2021. 8. 14.
[Spring] Spring의 Event를 어떻게 사용하는지에 대해서 알아봅시다 안녕하세요. 오늘은 Spring의 Event에 대해서 알아보는 시간을 가져보도록 하겠습니다. 오늘 알아볼 내용은 Event란 무엇인가 ? 그리고 Spring에서 구현하는 방법은 무엇인가 ? 에 대한 내요입니다. Event ? Spring은 내부에 Event라는 메커니즘을 가지고 있습니다. Event란 Spring의 Bean과 Bean 사이의 데이터를 전달하는 방법중 하나입니다. 일반적으로 데이터를 전달하는 방법은 DI를 통해서 이루어집니다. 아래의 코드를 보시면 A 클래스에서 B에 대한 의존성을 주입받는 것을 알 수 있습니다. 이렇게 A는 이제 B의 메서드를 호출하여 본인의 클래스에서 사용할 수 있게 됩니다. @Service public class A { private final B service; pu.. 2021. 8. 11.
[JPA] 테이블의 한 컬럼 내에서 N개의 값을 가지는 방법 안녕하세요. 오늘은 처음으로 여러분들께 JPA에 관련하여 포스팅을 하려고합니다. 저는 대부분의 프로젝트에서 JPA와 QueryDsl을 사용하고 있습니다. 사용하는 이유는 확실히 간편하기 때문입니다.. 그리고 String이 아닌 메서드 형으로 쿼리를 작성하기 때문에 만약 잘못된 점이 있다면 QueryDsl 덕분에 컴파일 타임에 찾을 수 있고 객체로 DB Table을 관리할 수 있다는 점이 있습니다. 사용하기 위한 러닝커브는 상당히 높은 편이지만 익숙해지기만 한다면 다시 Mybatis로는 돌아갈 수 없는 편함을 제공합니다. 여러분들과 오늘 이야기 나눠보고자 하는 내용은 JPA를 이용할 때 테이블의 컬럼에 내의 N개의 값을 가지는 방법입니다. 요구사항 한 게임에 게임에 대해서 리뷰를 남깁니다. 리뷰를 남길 때.. 2020. 12. 12.