현재 진행중인 프로젝트에서 spring boot 2.7.18 을 사용하고 있다. 현시점(2024.04.28) 기준 2.x 버전에서 가장 최신이다. 엔티티 로딩과정에서 직관적이지 못한 이슈를 만나서 정리하고, 어떤때 발생하고 어떻게 해결할 수 있는지 정리해보려한다. spring boot2.7.18hibernate-core5.6.15.Final # 이슈상황- 엔티티 Main 과 엔티티 Sub 는 1:1 관계로 @OneToOne 관계를 맺고있다(fetchType 은 디폴트 설정인 EAGER 를 사용한다). 외래키는 Main 에서 관리한다고 가정한다.- Main 과 Sub 는 논리적 연관관계만 가질뿐 데이터베이스 설정상으로 외래키 관계를 강제하지는 않는 상태다.- Main 과 Sub 는 두 엔티티가 모두 정상적..

이번껀 spring boot 3 로 업그레이드할때 누구나 만날만한 이슈도 아니고, 어떻게 보면 그냥 내 실수이지만 비슷한 이슈를 마주할 수 있기에 적어놓는다. 기존 spring boot 2 애플리케이션에서 circuit breaker 로 resilience4j 를 사용하고 있었다면 spring boot 3 에 맞게 resilience4j 도 버전을 올려줘야한다. 다만 resilience4j 같은 경우 spring boot 버전에 최적화된 아티팩트를 제공하고 있어서 이 부분 이름도 변경해줘야 한다. spring boot 2 spring boot 3 io.github.resilience4j:resilience4j-spring-boot2:${version} io.github.resilience4j:resili..
설정파일에 정의한 내용들을 객체에 바인딩할때 @ConfigurationProperties 애노테이션을 이용해서 주입할 수 있다. // yml file config: person: age: 33 name: LichKing // binding 할 객체의 클래스 @ConfigurationProperties("config.person") @NoArgsConstructor @Setter @ToString public class Person { private String name; private int age; } // 어디엔가 이 애노테이션을 선언해줘야 한다 @ConfigurationPropertiesScan 위처럼 정의하면 spring 컨테이너가 구동될때 Person 의 기본생성자를 이용해 인스턴스를 만들고, ..
jackson 을 이용할땐 나 같은 경우 항상 ObjectMapper 클래스를 이용했다. 그러다가 Serialization/Deserialization 에 각각 특화된 ObjectWriter/ObjectReader 클래스가 있다는걸 알게됐는데 ObjectMapper 를 사용하는 것과 어떤 차이가 있는지 알아보기로 했다. 먼저 ObjectMapper 의 가장 치명적인 문제는 스레드에 안전하지 않다는 것이다. 멀티 스레드 환경에서 공유 변수로 사용하게 될 경우 원치 않는 결과가 나올 수 있다. ObjectMapper 의 javadoc 에는 이렇게 적혀있다. Mapper instances are fully thread-safe provided that ALL configuration of the instanc..
이전 포스팅에서 id 프로퍼티를 어느 위치에 선언하는게 좋을지 얘기해봤다. 이번엔 Long 과 Long? 중 어떤걸로 선언할지, 어떤차이가 있는지, 그리고 왜 이런 고민을 하게되는지 얘기해보려한다. # Long? vs Long @Entity @Table(name = "person") class Person( @Column(name = "person_name") val name: String, @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "person_id") val id: Long? = null ) id 값의 생성을 DB 에 위임하는 IDENTITY 방식을 주로 사용할텐데 이 방식을 사용하면 엔티티가 영속화되기 전에는 id..
자바에서 entity 를 정의할 때는 id 를 어떻게 선언할 것인지에 대한 고민을 크게 할 필요 없었다. 보통 인스턴스 필드 선언부의 가장 최상단에 정의했을 것이다. @Entity @Table(name = "person") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "person_id") private Long id; @Column(name = "person_name") private String name; } 하지만 코틀린에서 정의할 때는 이런저런 고민을 하게된다. 아마도 코틀린이 자바보다 다양한 문법을 지원하고 있다보니 괜시리 더 고민이 되게 되는 것 같다. @Entity @Ta..
spring security 는 확장을 위해 WebSecurityConfigurer 라는 인터페이스를 제공하고 있다. spring 은 이전부터 확장 인터페이스에 대해 좀 더 용이하게 사용하도록 기본 구현을 하는 구현체들(추상클래스 포함)을 제공하는데 WebSecurityConfigurer 는 WebSecurityConfigurerAdapter 라는 추상 클래스가 그 역할을 한다. 확장이 필요한 경우 WebSecurityConfigurer 를 직접 구현하는 경우는 거의 없다. 이는 WebSecurityConfigurer 의 javadoc 에서부터 명시하고있다. Allows customization to the WebSecurity. In most instances users will use EnableWe..
spring boot 2 기반 애플리케이션을 spring boot 3 로 올리면서 겪은 이슈들에 대해 정리하고자 한다. 기본적인 방법은 공식 마이그레이션 가이드( https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide )를 참고하면 되는데, 문서에 나와있지 않거나 나와있지만 까다로운 부분들을 중점으로 다뤄보고자한다. spring framework 6(boot 가 아니다)부터 ListenableFuture 인터페이스가 deprecate 되었다. 인터페이스가 deprecate 되면서 자연히 그 구현체들도 모두 deprecate 되어 퇴출수순을 밟고있다. 다른 대체 인터페이스를 제공하는 것은 아니며 기존 JDK 에서..

spring data jpa 를 이용하면 repository 의 save() 메서드를 이용해서 엔티티를 저장한다. 이때 save() 메서드는 저장된 엔티티 객체를 반환하는데, 사실 파라미터로 전달된 엔티티 객체의 상태를 변경하고 그걸 그대로 반환하는거라 파라미터로 전달된 객체와 반환되는 객체가 같다. @Test void 동일한_객체를_반환한다() { var person = new Person("lichking"); var savedPerson = personRepository.save(person); assertThat(person).isEqualTo(savedPerson); } 이런 이유로 따로 equals 를 오버라이딩하지 않은 상태에서 Person 객체를 비교하면 테스트가 통과한다. spring d..
spring-boot-starter-web 을 이용해 웹서버 애플리케이션을 만들고 있다면 json 에 대한 핸들링은 jackson 을 이용하게 된다. 물론 jackson 외 다른 라이브러리를 이용하고 싶다면 변경할 수 있다. jackson 에서 실질적으로 json serialize/deserialize 를 담당하는 객체는 ObjectMapper 인데 스프링 부트로 애플리케이션을 만들어봤다면 별다른 설정을 하지 않아도 잘 돌아가는걸 확인할 수 있을 것이다. # custom serializer/deserializer 가 필요한 경우 널리 사용되는 타입들에 대해서는 대부분 정상적으로 serialize/deserialize 가 되기 때문에 고민할 거리가 없다. 하지만 개발자가 임의로 정의한 타입에 대해 원하는 ..
- Total
- Today
- Yesterday
- java8
- go-core
- Spring
- JavaScript Core
- Kotlin
- programming
- MySQL
- Jackson
- java
- db
- javascript
- frontcode
- http
- EffectiveJava
- spring cloud
- toby
- JPA
- clean code
- servlet
- DesignPattern
- Design Pattern
- TEST
- Git
- mariadb
- code
- generics
- frontend개발환경
- 정규표현식
- OOP
- backend개발환경
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |