2023년 회고
기록/후기, 회고2023. 12. 31. 21:202023년 회고

벌써 2023년이 몇 시간 안 남았다. 1년이 어떻게 갔는지 잘 모르겠다. 시간이 진짜 빠르다는 생각을 요즘 정말 많이 하는 것 같다. 며칠 전부터 올해를 돌아보며 그래도 열심히 했어! 아니야 난 너무 게을렀어 를 왔다 갔다 하며 ㅋㅋ 🥲 회고 쓰는 걸 미루고 있었다. 하지만 미뤄봤자 엄청난 글이 써지지 않는 걸 알기에.. 올해가 가기 전에 올해를 정리해보려고 한다. 졸업 올해 초에 졸업을 했다. 고졸 탈출~~ 과 동시에 어엿한 백수가 되었다. 학교 생활에 대해선 할 얘기가 많지만 정리하면 후회없이 열심히 살았다는 것이다. 전공 수업도 열심히 듣고 과제도 열심히 했다. 3학년 때는 거의 매일 울면서 타자를 치며 밤을 새웠던 기억이 난다 😂 그리고 운이 좋게도 수석으로 과를 졸업할 수 있게 되었다. 이걸 ..

테스트에서만 @Async 적용되지 않도록 하기
개발 공부/Spring2023. 12. 27. 23:39테스트에서만 @Async 적용되지 않도록 하기

⭐️ 방법 매우 간단함 주의.. 문제 상황 알림 발송 로직을 비동기로 처리하고 테스트를 수행하려니 아래와 같이 알림 발송을 검증하는 테스트가 깨지는 문제가 생겼다. 원인은 비동기 메서드인 notificationService.send()가 완료되기 이전에 값이 생성되었는지를 검증하려고 했기 때문이다. 더 큰 문제로, 비단 알림 발송 자체를 검증하는 테스트 뿐만 아니라 다른 테스트에서도 해당 테스트가 수행하는 로직이 특정 작업을 마치고 알림 발송을 수행하는 경우 동일하게 비동기 로직이 수행되어 테스트가 깨지고 있었다. 그 예시로, 위의 경우 테스트 완료 후 수행하는 reset.sql 에서 알림 테이블을 지울 때 존재하지 않던 알림이 (비동기로 실행되어) 회원 테이블을 지울 때 존재하게 되는 상황이다. 때문에..

[플랭고] 프로젝트 앱스토어 / 플레이스토어 배포 회고
프로젝트/[앱] 플랭고2023. 12. 23. 00:31[플랭고] 프로젝트 앱스토어 / 플레이스토어 배포 회고

올해 여름부터 개발해 왔던 장소기반 일정관리 서비스 '플랭고'를 드디어 앱스토어와 플레이스토어에 배포했다!처음에 생각했던 것보다는 이런저런 일 때문에 늦어졌지만 올해 안에 개발 시작부터 배포까지 한 사이클을 완료할 수 있어 굉장히 의미 있는 경험이었다. 비슷한 상황의 누군가에게 조금이라도 도움이 되었으면 좋겠다는 마음을 담아 개발 시작 단계부터 배포 과정까지 기억나는 일들을 정리해 봤다.플랭고가 궁금하시다면 아래 링크에서 다운받아 사용해 보실 수 있습니다! :)AppStore 링크 / PlayStore 링크프로젝트 시작 계기이 행운의 프로젝트는 대전의 한 해커톤에서 시작되어…사실 플랭고는 작년 가을 교내 앱 개발 해커톤인 '콜라톤'에서 시작된 프로젝트다. 2022년 9월부터 약 두 달간 팀원 4명이서 열..

[플랭고] 주요/부가 로직 트랜잭션 분리하기 - TransactionalEventListener와 REQUIRES_NEW
개발 공부/Spring2023. 11. 27. 17:53[플랭고] 주요/부가 로직 트랜잭션 분리하기 - TransactionalEventListener와 REQUIRES_NEW

플랭고는 친구와 함께 일정을 수정하고 장소를 추가하는 등 일정 공유 기능을 제공한다. 이때 새로운 일정에 초대되거나, 일정 초대를 수락/거절하거나 공유 중인 일정이 수정되는 등의 상황에 알림(자체 알림 목록 + 푸시)이 발송되도록 기능을 구현해두었다.기존에 알림을 발송하는 흐름은 다음과 같다. 먼저 일정 서비스에서 알림을 발송해야 하는 경우에 알림 DTO를 만들어 알림 서비스를 호출한다. 그러면 알림 서비스는 알림을 생성하고 외부 서비스인 FCM을 통해 대상 회원의 기기로 푸시 알림을 보낸다.이러한 흐름으로 알림을 발송하면 위 그림처럼 일정 -> 알림 -> 외부 서비스를 거치는 흐름 전체가 하나의 트랜잭션으로 묶이게 된다. 이런 식으로 코드를 구현하면 크게 다음과 같은 문제가 생길 수 있다고 생각했다. ..

[플랭고] 회원 가입 프로세스 개선하기
프로젝트/[앱] 플랭고2023. 10. 14. 22:31[플랭고] 회원 가입 프로세스 개선하기

여름부터 개발을 시작했던 플랭고가 이제 거의 배포 직전이라 자잘한 부분을 수정하고 있다. EC2에 백엔드 서버를 띄우고 애플에서 제공하는 테스트용 배포 플랫폼 TestFlight를 사용해 팀원들에게 앱을 배포하여 여러 기능을 테스트 하던 중 회원 가입 프로세스에 메일 인증 과정을 도입해야 하지 않겠냐는 피드백을 받았다. 문제 상황 메일 인증 로직은 개발을 처음 시작할 땐 분명 투두 리스트에 있었던 건데 개발을 바쁘게 진행하다보니 나중에 해야지 하고 미뤄두다가 결국 못하게 된 기능 중 하나이다. 어차피 배포하려면 꼭 필요한 기능이니 얼른 만들어보자고 마음을 먹었다. 현재는 유저가 앱을 통해 가입을 요청하면 메일 형식에 대한 검증만 수행하고 특별히 서버를 거쳐 메일을 인증하는 과정이 없다. 또한 회원 가입을..

[플랭고] JPA delete() 쿼리 안 나가는 문제 해결
개발 공부/Spring2023. 9. 28. 12:48[플랭고] JPA delete() 쿼리 안 나가는 문제 해결

💥 문제 상황 JPA를 사용하다가 xxxRepository.delete(Entity entity) 메서드를 통해 엔티티를 삭제하고 싶었는데 아무리 해도 delete 쿼리가 발생하지 않는 문제가 있었다. 엔티티 삭제 코드 @Transactional public void rejectOrExitSchedule(Long memberId, Long scheduleId) { Schedule schedule = findScheduleById(scheduleId); validateMemberNotOwner(memberId, schedule); ScheduleMember scheduleMember = findScheduleMemberByMemberIdAndScheduleId(memberId, scheduleId); sc..

[플랭고] 반정규화 + Lock vs 정규화 + 서브쿼리 - 누가 더 빠를까
프로젝트/[앱] 플랭고2023. 9. 17. 22:23[플랭고] 반정규화 + Lock vs 정규화 + 서브쿼리 - 누가 더 빠를까

배경 플랭고 앱 개발 중 기존에는 일정과 회원이 일대일로 대응되었는데 '함께 할 친구' 기능을 추가하면서 일정과 회원의 관계가 일대다로 변경되었다. 이에 따라 기존 조회, 수정 로직 등이 많이 변경되었는데 다른 부분은 모두 변경을 마치고 '일정 목록 조회' 기능에서 고민되는 부분이 생겼다. 현재 Schedule 테이블에 일정 관련 정보가 있고, ScheduleMember 테이블에 일정에 참여하는 회원에 대한 정보가 담겨있는데 앱에서 일정 목록 조회 시 다음과 같이 일정에 참여하는 회원 수를 표시해주기 위해서 목록 조회 시 Schedule과 ScheduleMember를 같이 조회해야 되는 상황이 생겼다. 이를 구현하기 위해 여러 방법을 사용할 수 있을 것 같았지만 각 방법 별 성능 차이를 확인하고 싶어서 ..

인프콘 2023 후기
기록/후기, 회고2023. 8. 31. 22:54인프콘 2023 후기

작년에 이어 올해도 인프콘에 다녀왔다! 워낙 치열한 경쟁률을 자랑하는 컨퍼런스라서 올해는 어렵겠지 생각했는데 작년 청년멘토링 프로그램을 통해 멘토링을 해주셨던 동욱님께서 너무나 감사하게도 초대권을 주셔셔 올해도 다녀올 수 있게 되었다. 작년 인프콘 후기 요즘 너무 정신이 없어서 시간이 가는걸 잘 못 느끼고 있었는데 작년 8월에 갔던 인프콘을 올해 다시 왔다고 생각하니 1년이 지났다는걸 확 실감할 수 있었다. 오프닝을 시작으로 인프콘이 시작되었다. 나름 인프콘 경력직(?)으로서 인프콘의 정수는 기업부스와 인프런 굿즈 뽑기임을 알고 있었기에 (아닙니다) 세션을 듣기 전에 기업 부스를 돌며 굿즈를 받으러 다녔다. 마침 우리가 듣고 싶은 세션이 모두 오후에 몰려있기도 했다. 기업 부스 기업 부스를 돌며 설명을 ..

[플랭고] JPQL fetch join + where절 사용 방법과 조건
개발 공부/Spring2023. 8. 29. 19:58[플랭고] JPQL fetch join + where절 사용 방법과 조건

프로젝트 개발 중에 fetch join 과 where 절을 함께 사용하고 싶은 상황이 생겼다. 아무생각 없이 코드를 치다가 순간 섬뜩해서 영한님 JPA 강의 자료를 뒤져보니 역시.. fetch join의 대상에 별칭을 주고 where 절에서 필터링하는건 불가능하다고 되어있었다. 그래서 고민을 좀 해봤는데 고민을 할수록 다음과 같은 고민들이 꼬리에 꼬리를 물고 생겨났다. fetch join은 별칭을 아예 줄 수 없나? where 절에 XToOne 쪽 필드를 조건으로 주는 경우는 어떻게 동작하나? fetch join 말고 join은 사용 해도 되는건가 그럼? 이 경우에는 어떻게 동작하지? 애초에 fetch join을 왜 where 절과 함께 사용하면 안 되는거지..? … JPA의 어려움에 멘붕이 올뻔했지만 ..

[플랭고] 일대일에서 일대다로 변경 시 validation 관련 문제 (Custom ConstraintValidator)
개발 공부/Spring2023. 8. 23. 01:08[플랭고] 일대일에서 일대다로 변경 시 validation 관련 문제 (Custom ConstraintValidator)

문제 상황 개발 중인 애플리케이션 플랭고의 '기록하기' 기능은 현재 1장의 이미지만 첨부할 수 있다. 이를 20장까지 첨부할 수 있도록 변경하는 작업을 진행했다. (사진은 2023 인프콘 🥹) 먼저 다음과 같은 작업들을 진행했다. 1. 이미지 url을 저장할 DiaryImage 테이블, 엔티티 생성 @Getter @NoArgsConstructor(access = PROTECTED) @Entity public class DiaryImage extends BaseTimeEntity { @Id @GeneratedValue(strategy = IDENTITY) private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "diary_id") private Diar..

image