도입8월 13일 당근마켓의 박용권님의 세미나를 참여했다.세미나의 제목은 ‘모놀리스 시스템 분할과 정복’이었고 복잡하고 거대한 시스템을 MSA가 아닌 modular monolith 아키텍처로 푸는 일련의 과정을 들을 수 있었다. modular monolith에 대해서는 이번 포스팅의 핵심 내용은 아니다. 관련해서는 용권님의 또 다른 발표 영상이 많이 있으니 보면 이해가 잘될 것이다.https://www.youtube.com/watch?v=SrQeIz3gXZghttps://youtu.be/uTSuVFyv81w?si=nFItCijVrAL4mvW0 한 문장으로 설명한다면 모듈형 모놀리스 아키텍처란 전통적인 모놀리스 아키텍처의 단순성과 모듈화의 이점을 결합한 아키텍처 스타일이다modular monolith 세미나..
전체 글
H2 DB로 테스트 수행 시 문제점 스프링으로 웹개발을 하고 테스트를 작성하고 있다면 H2 데이터베이스를 많이 사용한다. H2는 인메모리 데이터베이스로 스프링부트에 내장되어 있어 별도의 DB 설정 없이 간편하게 이용할 수 있다. 깃허브에서 프로젝트를 클론한 사람 모두가 테스트를 아무런 환경 세팅 없이 쉽게 돌릴 수 있고 테스트 속도도 빠르기에 개발 초기 단계나 토이 프로젝트에서 많이 사용하고 있다. 하지만 운영 환경에서는 MySQL 같은 데이터베이스를 사용하기 때문에 운영 환경과 다른 환경에서 테스트를 한다는 불안감이 있다. 실제로 환경적인 측면에나 문법적인 측면에서 다른 부분이 있어 테스트는 돌아가더라도 운영 환경에서 장애가 날 수도 있다. Transactional(readOnly = true) 문제 ..
프로젝트를 진행하던 중 배포를 한 뒤 에러가 발생해서 로그를 봤더니 데이터베이스에서 데드락이 발생하고 있었다. 따로 명시적인 락을 잡지 않았는데도 불구하고 데드락이 발생하니 처음엔 무슨 상황인지 이해할 수 없었다. 엔티티 구조 프로젝트의 핵심 도메인은 ‘지원서’이다. 동아리나 기업에 지원할 때 자소서나 지원서를 작성하게 되는데 지원서 작성과 보관을 도와주는 서비스기 때문이다. 하나의 ‘지원서’에는 여러 ‘문항’이 존재하기에 ‘지원 문항’과 그 ‘답변’을 하나로 묶은 ‘지원 항목’을 ‘지원서’와 일대다로 맺어주었다. @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class ApplicationForm { @Id @Gene..
최근에 처음으로 기술 면접을 경험했다. 프로젝트에 관한 질문이 많았는데 당시에 비즈니스 로직 중 비동기 처리를 해야 했었다. DB에 접근하는 로직이었기에 @Transactional과 @Async를 함께 적용시켜 사용했다. 이에 대해 면접관이 물었다. @Async와 @Transactional이 내부에서 어떻게 동작하는지 아시나요? 덧붙여서 상상력을 발휘해도 좋다고 했다. 정확하게 AOP 내부 구현을 몰랐던 나는 다음과 같이 대답했다. 아마 트랜잭션 관련 AOP 프록시가 부가 기능을 수행한 뒤 비동기 관련 AOP 프록시가 비동기 부가 기능을 넣고 마지막으로 target을 호출할 것 같습니다. 내부적으로 순서가 있을 것 같은데 반대의 순서도 상관없을 것 같습니다. 정확히 저렇게 말하진 않았겠지만 저런 흐름이었..
스프링 AOP 애플리케이션 기능의 종류에는 크게 핵심 기능과 부가 기능으로 나눌 수 있다. OrderService라는 객체에서 핵심 기능이라 함은 ‘주문을 한다’이고 부가 기능이라 함은 ‘트랜잭션 처리’라고 예를 들 수 있다. 이러한 부가 기능은 보통 여러 클래스에서 동시에 적용되는 데 이를 횡단 관심사(cross-cutting concerens)이라고 한다. 이러한 부가 기능을 적용하기 위해선 보통 많은 반복과 중복 코드, 그리고 중복으로 인한 많은 수정을 요하게 된다. AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)의 약자로 이러한 중복되는 횡단 관심사를 모듈화 하여 분리하기 위해 나온 패러다임이다. 동적 프록시 스프링에서는 AOP를 구현하기 위해 동적 프록시 기술을..
일대다 단방향 매핑은 쓰지 말자? 영한님의 JPA 기본편 강의를 보면 일대다 단방향 매핑을 지양해야 한다는 내용이 나온다. 자바 ORM 표준 JPA 프로그래밍 책에도 다음의 내용이 적혀 있다. 일대다 단방향 매핑을 사용하면 엔티티를 매핑한 테이블이 아닌 다른 테이블의 외래 키를 관리해야 한다. 이것은 성능 문제도 있지만 관리도 부담스럽다. … 다대일 양방향 매핑은 관리해야 하는 외래 키가 본인 테이블에 있다. … 상황에 따라 다르겠지만 일대다 단방향 매핑보다는 다대일 양방향 매핑을 권장한다. 양방향 참조는 객체지향적으로 손해 하지만 흔히 알고 있듯이 순환 참조, 양방향 참조는 객체지향 세계에서는 지양하는 편이다. 의존 관계나 연관 관계를 단방향으로 흐르게 하여 A가 변할 때 B는 영향을 받더라도 B가 변..
문제 상황 프로젝트를 하면서 우리도 모르게 예외가 터지는 경우가 많아서 실제로 기능에 버그가 있는데 빠르게 캐치하지 못한 적이 많았다. 예외가 발생했을 때 개발자인 우리에게 알려줄 수 있으면 좋겠다고 생각이 들었다. Github 이슈 자동 등록 스모디 팀 슬랙 채널이 존재한다. 프로젝트 깃허브에 PR, Issue 등록, Merge 등의 이벤트가 발생하면 슬랙 채널에 메시지가 오도록 Guthub 앱을 등록한 상태다. Create an Issue POST https://api.github.com/repos/woowacourse-teams/2022-smody/issues Autuorization: token {accessToken} { "title":"이슈 제목", "body":"이슈 바디", "assigne..
새로운 기능 추가에 대한 이야기 스모디 서비스는 사람들에게 동기부여를 해주는 서비스로, 챌린지에 도전하여 인증을 하는 것이 주 콘텐츠이다. 단순한 인증을 넘어, 조금 더 사용자들에게 동기부여를 해주기 위해 랭킹에 관한 기능을 추가하기로 했다. 랭킹 로직을 이벤트로 처리 회원이 챌린지를 인증하면 주간 랭킹 점수에 반영 된다.라는 기능을 추가하려고 한다. 챌린지 인증 → CycleService.increaseProgress() 랭킹 관련 로직 → RankingService 랭킹 로직과 챌린지 로직이 강한 결합을 갖는 것을 막고 랭킹에 장애가 발생해도 챌린지 인증은 정상 동작시키기 위하여 이벤트(@TransactionalEventListener) + 비동기 처리(@Async)를 하기로 선택했다. ( Cycle..