본문 바로가기

스프링22

[Reactive Programming] 비동기-논블로킹 프로그래밍 동기 프로그래밍 (Synchronous) 작업의 실행 흐름은 순차적으로 동작 코드를 파악하기 쉽고 결과를 쉽게 예측 가능하므로 디버깅이 쉬움 특정 작업 중 다른 작업을 할 수 없다는 단점 비동기 프로그래밍 (Asynchronous) 작업의 실행 흐름은 기본적으로 순차적이지 않음 현재 실행 중인 작업 이외에 다른 작업 가능. 클라이언트, 서버 등 모든 환경에서 유용하게 사용 가능 대표적으로 CallBack, Promise, Future, Coroutine 등이 있다. 비동기 프로그래밍 구현 방식 - Kotlin Thread 가장 기본이 되는 방식 Runnable 인터페이스를 구현하여 구현 하나의 스레드 - 싱글 스레드, 다중 스레드 - 멀티스레드 fun main() { for (i in 0..5) { va.. 2023. 2. 11.
사이드 프로젝트를 시작하게 되었다. 사이드 프로젝트를 시작하게 되었다. 회사 프론트 개발자 분이 사이드 플젝을 구할 수 있는 웹 서비스를 알려주셨고, 한번 해보고 싶다는 생각이 강하게 들었다. 슬러시와 오픈 채팅방을 포함하여 총 3곳에 신청 및 문의를 넣었고, 답변이 다들 없으시길래 요구하는 조건이 높겠구나 하는 생각이 들었다. 이왕 이렇게 된 거 내가 만들면 되지. 그 동안 추상적으로 구상한 서비스의 아이템을 한번 구현해보자. 구현하면서 실현 가능성을 확인해보자. 그렇게 같은 개발 길을 걷고 있는 형들에게 제안을 드렸고, 실행하게 되었다. 제대로 해보자 해서 노션도 정리하고, 깃헙 Organization도 만들었다. 이번 1달 동안 요구 사항을 구체적으로 정리한다는 목표도 세웠다. 개발을 시작하기 위해 필요한 선행 지식이 다른 프로젝트원.. 2023. 2. 7.
[Spring Data JPA] Transaction 없이 읽기 회사에 입사해서 코드를 살펴보던 중에 분명히 jpa entity 객체의 읽기 과정 중, 분명히 트랜잭션 처리가 필요한 코드가 보였다. 이를테면 Spring Security 인증을 거치고 Security Context Holder 에 저장된 UserPrinciple 객체 @Target(AnnotationTarget.VALUE_PARAMETER) @Retention(AnnotationRetention.RUNTIME) @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : user") annotation class CurrentUser(val require: Boolean = true) 이러한 애노테이션을 흔히들 전역적으로 Api 에서.. 2023. 1. 30.
[이슈] Pageable test 관련 에러 💡문제 API Controller를 테스트 하는데 잘 성공하던 테스트가 계속 실패한다. org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No primary or single unique constructor found for interface org.springframework.data.domain.Pageable 테스트 코드 mockMvc.perform(get("/api/v2/users") .param("page", String.valueOf(page))) .andExpect(status().isOk()) .andE.. 2022. 11. 23.
[만들면서 배우는 클린 아키텍처] Chapter6. 영속성 어댑터 구현하기 CH 6. 영속성 어댑터 구현하기 1. 의존성 역전 서비스가 영속성 기능을 사용하기 위해 포트 인터페이스를 호출 육각형 아키텍처에서 영속성 어댑터는 주로 아웃고잉 어댑터 => 앱에서 호출하기 때문, 반대의 경우는 없다. 포트는 앱과 영속성 사이의 간접적 계층 영속성 문제에 신경쓰지 않고 도메인 코드 개발 목적 영속성 계층에 코드 의존성을 없앰 이럴 경우, 영속성 코드를 변경하더라도 코어 코드에 영향이 없음 런타임에도 여전히 앱이 영속성 코드에 의존하고 있다. 인터페이스 계약을 만족하는 한 영속성 코드 수정은 문제가 없다. 2. 영속성 어댑터의 책임 입력을 받는다. 주로 도메인 엔티티, DB 연산 전용 객체 입력을 데이터베이스 포맷으로 매핑한다. JPA Entity 객체 매핑 JPA를 제외한 기술도 고려 .. 2022. 10. 31.
[만들면서 배우는 클린 아키텍처] Chapter5. 웹 어댑터 구현하기 CH.5 웹 어댑터 구현하기 1. 의존성 역전 Web Adaptor = Incomming Adaptor 외부로부터 요청 받음 => 애플리케이션 코어 호출 => 무슨 일을 해야할지 알려줌 애플리케이션 계층은 웹 어댑터가 통신할 수 있는 포트를 제공 서비스는 포트 구현 & 웹 어댑터가 이 포트를 호출 제어 흐름 왼쪽 => 오른쪽 웹 어댑터가 유스케이스를 직접 호출할 수 있지만 간접 계층을 넣음 포트 (간접 계층)는 외부와 통신할 수 있는 곳에 대한 명세서 어떤 통신이 일어나는지 명확하게 알 수 있음. Outgoing Port 이 포트는 웹 어댑터에서 구현하고 애플리케이션 코어에서 호출해야 한다. 웹 어댑터는 인커밍 & 아웃고잉 어댑터가 될 수도 있다고 한다. 2. 웹 어댑터의 책임 거시적 관점 HTTP 요청.. 2022. 10. 30.
결제 API 리팩토링 - [1] (feat. 전략 패턴) 결제 API를 리팩토링 시작하며 외부 API를 연동 부분에 대해서 생각해봤다. 기존에도 카카오페이를 이용했었고, 지금도 카카오페이를 이용할 것이지만, 추가적으로 다른 결제 API를 연동할 수 있을 만한 상황을 생각해봤다. 스프링을 처음 공부하기 시작할 때 읽었던 책인 개구리 (스프링 입문을 위한 뭐시기..) 책에서 스프링에서 사용하는 다양한 디자인 패턴들을 알게 되었다. 그 때는 디자인 패턴이란 것에 대해 감이 잘 오지 않았는데, 직접 적용할 기회와 상황이 없었기 때문이라고 생각해본다. 계속 면접 질문 대비해 앵무새처럼 달달 외우고 다니던 도중 직접 적용할 기회가 딱 생겼고, 객체지향 개발 2원칙인 OCP에 찰떡일 것이라는 머리 속의 외침이 울렸다. 그대로 적용해보았다. 기존 플로우 컨트롤러 서비스(카카.. 2022. 9. 20.
객체 간 매핑을 위한 MapStruct 사용 방법 기존 프로젝트에서 Dto Entity를 매핑할 때 model mapper 라이브러리를 사용했었다. 편하게 사용할 수 있었지만 내부적으로 리플렉션을 이용하기 때문에, 성능 상 문제가 있다. 이번에는 많이들 추천하는 Map Struct를 사용해봤다. 적용하면서 자잘한 문제들이 있었는데, 내가 겪은 문제점들에 대한 해결 방법들을 정리해보겠다. https://mapstruct.org/documentation/dev/reference/html/ MapStruct 1.5.2.Final Reference Guide If set to true, MapStruct in which MapStruct logs its major decisions. Note, at the moment of writing in Maven, al.. 2022. 8. 29.
코드 리팩토링 [1] 지난 1주일간 기존 프로젝트의 리팩터링을 위해 새로운 저장소를 생성했다. 아키텍처 부분 설계를 거의 2, 3일은 한 것 같다. 아직 수정이 필요하겠지만, 항상 고민해보자. 기존 프로젝트는 multi module로 진행했지만, 완벽한 멀티 모듈 프로젝트 이진 않았다. 모놀리틱으로 갈지, MSA를 고려해 모듈간 분리를 할지가 계속 고민된다.. 확장성을 위해 모듈, 패키지간 의존성 분리를 틈틈이 고려해봐야겠다. 기존 작성 코드를 옮기며 조금 더 클린한 객체지향적인 코드로 리뷰어님의 피드백을 통해 수정해나갔다. 많이 알고 있었다고 생각한 부분에서도 헛점이 있었고, 전혀 알지 못했던 디테일한 부분도 알아나가는 중이다. 인증 및 인가 부분은 기존 프로젝트에서는 손수 구현했지만, 이번에는 Spring Security.. 2022. 8. 3.
리팩토링 계획 오랜만에 블로그에 글을 쓴다. 지난 며칠 동안 프로젝트를 배포하기 위해 AWS 망구성을 하고, 프로젝트를 빌드하며 배포까지 시켰다. 부하 테스트를 앞두고, 좋은 기회를 얻어 코드 리뷰를 받게 되었다. 결론은, 이 상태로 부하 테스트를 진행하는 의미가 없을 정도로 심각한 문제가 많았다. 프로젝트를 시작하며 아쉬운 코드 작성 부분도 많았고, 궁금증도 많았지만, 나머지 주관적인 판단하에 깔끔한 부분은 나름 괜찮게 작성을 했다고 생각했었다. 아직 고칠게 많았고, 배울게 많았고, 몰랐던 것이 많은 나였다. 이런 리뷰를 들을 때마다 나는 아직 한참 멀었구나. 공부 기간 대비 많은 성장을 거두었다고 생각했는데, 내가 욕심이 많은 건지. 사실은 기간 대비 성장치가 평균치였던 건지. 무기 해진다. 너무 급한가? 그럼에도.. 2022. 7. 28.
JPA 개념 정리 JPA 책을 이제 막 다 읽었다. ORM을 처음 공부한다는 생각에 긴장이 많이 됐지만, DB 공부도 하고, 객체지향에 대한 공부를 충분히 한 상태여서 그런지 생각보다 기존에 읽었던 real mysql, 토비의 스프링 3.1보다 잘 읽혔다. 기존에 database layer는 Mybatis 프레임워크를 이용해 구현했지만, 이는 문제가 있었다. SQL 중심의 개발이 되는 것이다. 앞으로 할 일이 많이 남았으므로, JPA로의 리팩터링을 슬슬 시작해보자. JPA Java Persistence API 자바 진영의 ORM 표준 기술 ORM Object Relational Mapping 객체와 관계형 데이터를 매핑 데이터를 객체에 저장할 수 있다. Hibernate 가장 많이 사용되는 ORM 프레임워크 JPA 인터페.. 2022. 7. 15.
리팩터링 「Authentication(인증)」 태어나서 처음 회사에 지원했다. 서류를 여러 군데 넣었다. 벌써 서류 탈락만 3번째이다. 서류 탈락이 이런 기분이구나...ㅎㅎ 회사 기준에 부합하지 않는 내 실력과 결과물 탓이지 뭐. 더 열심히 다듬어야겠다. 서류를 다듬다가 인증과 인가 구현 중 이슈를 작성했던 부분이 눈에 띄었다. 인증과 인가... 음... 인가는 애노테이션을 이용해 인터셉터로 구현한 명확한 근거가 있었다. 인증은 좀 애매했다. JWT 토큰을 인증하는 부분은 굳이 인터셉터까지 도달할 필요가 없다. 그래서 인증 작업을 인터셉터에서 필터로 리팩토링을 진행했다. 필터(Filter)란? HTTP 요청과 응답을 거른 뒤 정제할 수 있는 기능이다. Servlet Container 단에서 동작한다. 스프링 범위 밖에서 처리된다. Dispathcer.. 2022. 7. 11.
OutBox Pattern & Saga Pattern & Transaction 지난번 포스팅을 이후로 3일간 테스트 코드에 관한 공부를 하며 리팩터링을 진행했다. 데이터 분산 환경에서의 트랜잭션의 고려도 충분히 중요한 설계 같다. 그 리팩터링 과정을 정리해보겠다. https://sweeeetgoguma.tistory.com/entry/%E3%80%8COutBox-Pattern%E3%80%8D-%ED%99%9C%EC%9A%A9 「OutBox Pattern」 활용 https://github.com/GroovyArea/MyChickenBreastShop/wiki/Version-1 GitHub - GroovyArea/MyChickenBreastShop: ChikenBreastShop API with Spring boot ChikenBreastShop API with Spring boot... 2022. 6. 13.
2022.06.01 「결제 API - Ver.2」 지난번 포스팅에 이어 작성하겠다! https://sweeeetgoguma.tistory.com/entry/20220529-%E3%80%8C%EA%B2%B0%EC%A0%9C-API%E3%80%8D 2022.05.29 「결제 API」 장바구니 crud 작업한 것을 수정 및 테스트를 이번 주에 끝내고 나서, 뒤늦게 결제 API를 설계하기 시작했다. 카카오 페이 API를 사용해서 해보려고 하는데, 생각만큼 쉽지 않았다. 어디서 본 건데 sweeeetgoguma.tistory.com 카카오페이 Rest API를 이용해 결제 준비에 필요한 객체를 설계하는 것까지 완료했다. 카카오 페이 프로세스에 따라 준비와 결제 및 승인을 위한 통신 객체를 생성해야 한다. 이 과정 속에서 수많은 삽질이 있었다. 사실 삽질이라기보다.. 2022. 6. 1.
2022.05.28 「쿠키 수정」 장바구니 API를 처음 구현해보는 쿠키로 힘들게 짰었다. 오늘 주문 API를 구현하려고 카카오페이 관련 API 탐색 및 구상을 하던 도중 장바구니 데이터를 가지고 결제하는 경우를 떠올렸다. 다시 한번 장바구니 API 동작이 잘 되는지 포스트맨으로 확인을 하던 도중 이상한 쿠키 에러가 발생하는 것을 발견할 수 있었다.. 다시 한번 점검을 통해 코드 수정을 하며 단번에 완벽한 코드를 작성한다는 자만심 느꼈던 자신에 반성을 하게 되었다..ㅎㅎ 문제점 장바구니 상품 추가가 되질 않는다 쿠키가 다중으로 생성된다 => 이 두 가지 문제가 제일 컸다 기존 코드 장바구니 쿠키를 수정하여 response 객체에 삽입한다. 문제 새로운 쿠키가 같은 Key를 가진 객체가 생성되어 저장된다. => 내가 원한 건 기존 쿠키를 .. 2022. 5. 28.
반응형