전체 글 22

Spring Event로 강결합 서비스 분리하기

문제 상황 제가 운영하는 시스템에서 몇 가지 핵심적인 데이터들이 있습니다. 배치 중에 사용하는 설정값들이나, 조직에 대한 정보들이 바뀌면 각 업무 담당자들이 모두 영향을 받습니다. 이 값들은 업무 담당자라면 누구나 수정할 수 있는 값입니다. 그렇다고 변경이 제대로 공유되지는 않습니다. 강결합된 서비스 class Fund( val code: String, val name: String, var team: Team, ) { fun changeTeam(newTeam: Team) { this.team = newTeam } } class Team( val code: String, val name: String ) 다음과 같은 도메인 객체가 있습니다. @Service @Transactional class FundU..

Spring/Core 2023.09.26

'setReadTimeout(int)' is deprecated and marked for removal 해결

1. 문제 RestTemplate를 사용할 때, 연결 타임아웃 시간과 읽기 타임아웃 시간은 기본적으로 셋팅하게 됩니다. 하지만 spring 6.0 부터는 RestTemplate를 설정할 때, HttpComponentsClientHttpRequestsFactory()에서 setReadTimeout() 메서드를 사용할 수 없습니다. org.springframework.http.client.HttpComponentsClientHttpRequestFactory 2. 해결 RestTemplateBuilder를 사용하면 해당 문제를 해결 할 수 있습니다. @Bean("restTemplateCustom") fun restTemplate(builder: RestTemplateBuilder): RestTemplate {..

[Querydsl] Querydsl with Kotlin (Kotlin으로 querydsl 사용하기)

1. 의존성 설정 2. JPAQueryFactory 빈으로 등록하기 3. Querydsl을 사용할 인터페이스와 구현 클래스 만들기 4. 확인해 보기 kotlin으로 querydsl을 사용하기 위해 작업했던 내용을 기록으로 남겨보고자 합니다. 실제 코드는 https://github.com/gyuhwanhwang/my-book-gallery-kotlin 여기에서 확인하실 수 있습니다. 1. 의존성 설정 먼저, querydsl을 사용하기 위해선 `jakarta.persistence.@Entity` 애너테이션을 스캔하여 Q-types를 만들어내야 합니다. 그러기 위해선 kapt(Kotlin Annotation Processing Tool) 플러그인을 사용하여 Kotlin에서도 Java 애너테이션 프로세서를 사용..

JPA/Querydsl 2023.09.07

[Unix] mac 특정 포트를 사용중인 프로세스 종료시키기: (lsof, kill 명령어) Web server failed to start. Port 8080 was already in use. 해결

1. PID (프로세스 ID) 찾기 2. 프로세스 종료시키기 2-1) `9` KILL 시그널 주의사항 2-2) default 시그널 `15` TERM 스프링 부트로 웹 애플리케이션을 로컬에서 실행시켰을 때 다음과 같은 에러가 발생할 때가 있습니다. 저의 경우에는 IntelliJ IDEA가 오류로 혼자 종료되었는데, tomcat 프로세스는 죽지 않고 살아있어서 발생하였습니다. 두 가지 unix 명령어를 기록할 겸 간단한 포스팅 남겨봅니다. 1. PID (프로세스 ID) 찾기 lsof -i :포트번호 [lsof] : "List Open Files"의 약자이며, 파일이나 네트워크 연결 등 시스템에서 열려 있는 모든 '파일'에 대한 정보를 제공합니다. [-i] : 네트워크 인터페이스 옵션입니다. 이 옵션을 사용..

[Kotlin] 코프링 프로젝트 예제 build.gradle.kts 기록

https://kotlinlang.org/docs/jvm-create-project-with-spring-boot.html#explore-the-generated-spring-boot-application Create a Spring Boot project with Kotlin | Kotlin kotlinlang.org 코틀린 공식 문서에 나와있는 코프링 프로젝트의 예제를 작성하다가, gradle 빌드 스크립트를 groovy 에서 kotlin으로 처음 사용해 보았습니다. 기존에 Java와 gradle-groovy를 사용할 때와 몇가지 추가된 설정들이 있어 주석과 함께 기록을 남겨봅니다. import org.jetbrains.kotlin.gradle.tasks.KotlinCompile // For `Kot..

[컨퍼런스] 점핏 개취콘 백엔드편 오프라인 후기

[컨퍼런스] 점핏 개취콘 백엔드편 오프라인 후기 1. 입장 2. 세션 3. 후기 0. 오프라인 참여자 선정 점핏에서 진행하는 개취콘 백엔드편에 오프라인 참석이 당첨되어 다녀왔습니다 ㅎㅎ 경쟁률이 10대 1 정도 되었다고 하는데, 운 좋게 당첨되었네요. 인프콘에 못 가서 많이 아쉬운 상태였는데, 개취콘 당첨 문자를 받고 기분이 많이 좋아졌습니다. 1. 입장 원래 계획은 입장 시작 시간인 12시 30분에 맞춰서 가는 것이었습니다. 이전 프론트엔드편 후기들을 보니, 처음에 가야 도서들도 다양하고 부스 체험도 할 수 있다고 해서 좀 일찍 가려고 했는데 준비하다 보니 좀 늦어졌습니다 ㅜㅜ 강남역에서 1시 좀 넘어서 내리고 조금 걷다보니 모나코스페이스가 나왔습니다. 이쪽이 강남역치곤 좀 조용한 구역이었습니다. 안내..

후기/컨퍼런스 2023.08.27

[클린 아키텍처] 아키텍처 청소부 스터디 후기

0. 클린 아키텍처 스터디를 시작하게 된 이유 좋은 기회로 내놓으라 하는 국내 서비스 대표기업에서 주최하는 스터디에 참여할 기회를 얻게 되었습니다. 여러 가지 주제가 있었고, 그중에 선택해서 지원하는 방식이었는데 클린 아키텍처 스터디와, 대규모 시스템 설계 스터디 둘 중에 고민을 하게 되었습니다. 지원 당시에 한참 객체지향에 대해 공부하고 있었습니다. JPA를 공부하고 프로젝트를 시작해보려고 하는데, 어느 메소드를 어느 클래스에 만들어야 하는지가 스스로 명확히 할 수 없었기 때문이었습니다. 어느 정도 객체지향을 공부하고 보니 "그래, 이 객체에 이 역할을 부여해야지"라는 생각이 들기 시작했는데, 이제 문제는 "얘를 어디에 배치하지? "였습니다. 우리가 흔히 접하는 계층형 아키텍처(레이어드 아키텍처)에서도..

[멀티 모듈] 왜 멀티 모듈인가? 멀티 모듈 학습하기

언제 한번 멀티 모듈에 대해서 공부해봐야지 했는데, 그게 오늘이 되었습니다. 멀티 모듈의 사용 이유는 인터넷의 많은 자료에서 공통적으로 사용되는 코드의 재사용과 휴먼 이슈를 없앨 수 있는 이유을 가장 많이 이야기 합니다. 저의 경우엔 "만들면서 배우는 클린 아키텍처" 책을 보다가 10장. 아키텍처 경계 강제하기에서 나온 내용을 보고 왜 멀티 모듈이 중요한지 알게 되었습니다. 1. 왜 중요할까? 많은 예시로 드는 공통적으로 참조하는 도메인 영역에 대한 예시는 많이 나와있으니, 아키텍처 경계에 대한 이야기를 해보겠습니다. 클린 아키텍처가 아니더라도, 아키텍처의 핵심은 의존성에 대한 관리입니다. 의존성을 제대로 관리하지 못하면 코드에 점점 순환참조가 생겨나고, 새로운 기능 추가나 유지보수를 어렵게 합니다. 그..

아키텍처 2023.08.17

[JPA 오류] Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument 오류

@WebMvcTest를 진행하는데 아래와 같은 오류를 만났습니다. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377) at org.springframework.be..

오류 해결/JPA 2023.07.23

[Security] Spring Security 6 적용해보기

이동욱님의 스프링부트와 AWS로 혼자 구현하는 웹서비스 책을 쭉 따라가다보니 Spring Security를 적용하는 부분이 있었습니다. 책이 쓰여질 당시에는 boot 버전도 2이고, spring도 5버전대였던 것 같은데, 예제를 boot 3버전, spring은 6버전대로 적용해가며 따라가 보았습니다. 문제가 됐던게 spring security 적용하는 부분이었습니다. spring security가 SecurityFilterChain을 적용하는 부분부터 많이 변경되어서 그런거 같은데, 만났던 오류 상황들을 정리해보려고 합니다. 1. Authentication(인증) vs Authorization(인가) 기본적으로 스프링 시큐리티가 해결하고자 하는 핵심적인 문제인 인증과 인가에 대해서 공식문서를 보면서 쭉 ..

Spring/Security 2023.07.23