본문 바로가기

Spring34

[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을 이용해보자 - webFlux 적용편 안녕하세요. 이전 시간의 포스팅에서 problem spring web을 Spring MVC에 적용하는 시간을 가져보았습니다. 오늘은 이를 webflux에 적용해보는 시간을 가져보도록 하겠습니다. Spring WebFlux 의존성 problem spring web을 사용하기 위해서는 아래의 의존성이 필요합니다. Spring Web과 전체적인 이름은 유사하지만 동일하지는 않기 때문에 주의하시기 바랍니다. implements("org.zalando:problem-spring-webflux:0.26.2") 환경설정(Configuration) 의존성을 넣어주었으면 이제 환경설정을 해볼 차례입니다. 환경설정은 problemModule에 대한 설정과 json으로 응답값을 만들어 낼때의 mapper를 변경하는 설정이 .. 2022. 3. 6.
[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] 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.
[kotlin + Spring] 코틀린 환경에서 Spring Boot 사용하기 우리가 자바를 사용하는 이유는 스프링 프레임워크가 있기 때문이다라는 말이 있을 정도로 자바 언어를 사용하는 유저에게 스프링은 정말 없어서는 안될 존재이기도 합니다. 최근 코틀린이 자바유저들의 관심을 받기 시작한것도 물론 언어적으로 좀 더 실용적이라는 관점도 있지만 스프링을 사용할 수 있기때문에 진입장벽이 낮게 여겨지는 이유도 있을것이라고 봅니다. 그런이유로, 오늘은 코틀린 환경에서 스프링 프레임워크를 사용해보도록 하겠습니다. 환경 오늘 프로젝트는 아래의 환경을 기반으로 이루어집니다. 만약 동일하게 따라했으나 오류가 난다면 버전문제일 수 있으니 확인해주시기 바랍니다. JDK 버전 : 1.8.0.292 kotlin 버전 : 1.4.32 spring boot 버전 : 2.4.5 gradle 버전 : 6.8.3.. 2021. 7. 25.
[redis + Spring] Spring Data Redis를 이용한 Transaction 처리 안녕하세요. 오늘은 Java의 Spring 환경에서 Transaction을 적용해보도록 하겠습니다. 의존성 먼저 Spring에서 Redis를 사용하기 위해서 아래와 같은 의존성을 부여하도록 하겠습니다. spring-boot-starter의 버전은 본인이 사용하시는 SpringBoot 버전을 기본적으로 따라가기 때문에 버전은 따로 명시하지 않았습니다. implements("org.springframework.boot:spring-boot-starter-data-redis") 환경설정 아래는 redis와 연결하기 위한 관련된 application.yml 파일입니다. spring: redis: port: 6379 host: localhost Redis도 @Transactional을 이용해서 트랜잭션을 관리할 .. 2021. 7. 22.