우아한테크코스

문제 상황 프로젝트를 하면서 우리도 모르게 예외가 터지는 경우가 많아서 실제로 기능에 버그가 있는데 빠르게 캐치하지 못한 적이 많았다. 예외가 발생했을 때 개발자인 우리에게 알려줄 수 있으면 좋겠다고 생각이 들었다. 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..
알림 적용기 1편 알림 적용기 2편 이것저것 알아봤으니 이제 프로젝트 코드에 알림 트랜잭션 분리를 적용해 보고자 한다. 챌린지 인증 임박 알림 트랜잭션 분리 테스트 작성 @DisplayName("알림 이벤트에 예외가 발생해도 새로운 사이클은 저장된다.") @Test void cycleCreate_pushEventException() throws InterruptedException { // given LocalDateTime now = LocalDateTime.now(); willThrow(new RuntimeException("알림 로직에 예상치 못한 예외 발생!")) .given(pushEventListener).handle(any(PushEvent.class)); // when Long cycleI..
레벨 4로 접어들면서 톰캣 만들기 미션을 하게 되었는데 제공받은 초기 코드부터가 흥미로웠다. public class Application { private static final Logger log = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { log.info("web server start."); final var tomcat = new Tomcat(); tomcat.start(); } } 위 코드만 실행 시켜도 자바 애플리케이션이 꺼지지도 않으면서 localhost:8080으로 오는 요청을 받고 있는 것이 신기해서 소스 코드를 한 번 분석해 보았다. Application { final var ..
문제 상황 이전 포스팅을 보고 오면 이해가 더 쉬울 것이다. 예제 코드 댓글을 저장하면 알림을 저장하는 로직을 단순화시킨 예제 코드이다. CommentController @RestController @RequiredArgsConstructor public class CommentController { private final CommentService commentService; @PostMapping("/comments") public ResponseEntity create(@RequestParam String writer, @RequestParam String content) { Long commentId = commentService.create(writer, content); return Resp..
문제 상황 우테코에서 진행하고 있는 프로젝트에서 알림 기능 구현을 담당하게 되었다. 알림을 보내는 방법에 대해서는 PWA 기반의 웹 푸시 알림을 적용하게 되었는데 여기서 자세하게 이 내용을 다루지는 않고 설계에 관해서만 초점을 맞추고자 한다. 일단 알림을 보내는 클래스와 메서드 api만 간단하게 살펴보자. webPushService.sendNotification(pushSubscription, pushNotification); WebPushService의 sendNotification 메서드를 이용하면 이용자에게 알림을 보낼 수 있다. pushSubscription에는 pc 브라우저나 스마트폰 브라우저 등 알림을 수신할 브라우저에 대한 정보가 들어 있다. pushNotification에는 이용자에게 보낼..
문제 상황 현재 진행하고 있는 프로젝트에서 JPA를 사용하고 있다. 우선 테이블 구조는 다음과 같다. Member는 신경 쓸 필요 없이 Cycle과 Challenge만 살펴보면 된다. 현재 Cycle은 Challenge를 참조하고 있고 다대일 단방향 매핑으로 구현되어 있다. @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Cycle { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "cycle_id") private Long id; @JoinColumn(name = "member_id") @ManyToOne(fetch = Fetch..
클라이언트에서 요청을 받는 RequestDto 객체 Service에 노출되지 않게 하기 @PutMapping("/{lineId}") public ResponseEntity updateLine(@PathVariable Long lineId, @RequestBody LineRequest lineRequest) { lineService.update(lineRequest.toEntity(lineId)); return ResponseEntity.ok().build(); } JSON 형태의 클라이언트 요청을 받는 Dto 객체인 LineRequest를 컨트롤러에서 엔티티 객체로 변환시켜 Service 레이어로 넘겨주고 있다. 이렇게 설계한 이유는 LineRequest라는 Dto는 어떤 UI에 사용되는지에 따라, UI..
더즈
'우아한테크코스' 카테고리의 글 목록