알림 적용기 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..
HTTP는 상태를 가지지 않는다. HTTP는 stateless 프로토콜로 상태를 유지하지 않는다. 덕분에 확장성이 높다는 장점도 있지만 로그인 같은 상태를 유지해야 하는 로직에서 단점을 보인다. 때문에 쿠키와 세션 그리고 토큰 등을 사용해 상태 유지 기능을 구현한다. 로그인 처리 - 쿠키 서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달한다. 그러면 브라우저는 앞으로 해당 쿠키를 지속해서 보내준다. 쿠키 생성 위 예제에서는 예시로 쿠키에 memberId를 넘겨주었다. 최초 로그인 후 쿠키에 memberId를 담아 보내면 브라우저에서 이후 모든 요청에 받은 쿠키를 보낸다. 덕분에 서버에서는 로그인한 사용자라는 것을 인식하고 권한을 부여한다. 쿠키와 보안 문제 쿠키값은 임의로 변경할 ..
4장 결과를 전달하는 HTTP 상태 코드 4.1 상태 코드는 서버로부터 리퀘스트 결과를 전달한다. 1xx Information 리퀘스트를 받아들여 처리 중 2xx Success 리퀘스트를 정상적으로 처리했음 3xx Redirection 리퀘스트를 완료하기 위해서 추가 동작이 필요 4xx Client Error 서버는 리퀘스트 이해 불가능 5xx Server Error 서버는 리퀘스트 처리 실패 4.2 2xx 성공(Success) 리퀘스트가 정상으로 처리되었음을 나타낸다. 200 OK 리퀘스트를 서버가 정상 처리하였음을 나타낸다. GET 메서드의 경우 리퀘스트된 리소스에 대응하는 엔티티가 리스폰스에 보내진다. 201 Created 요청에 성공해서 새로운 리소스가 생성됨 생성된 리소스는 응답의 Locatio..
뇌피셜 주의!! 공부하는 단계에서 도메인과 엔티티에 대해 찾아보며 제 생각을 정리해 본 글입니다. 도메인이란? 위키백과에는 다음과 같이 나와있다. 도메인은 일반적인 요구사항, 전문 용어, 그리고 컴퓨터 프로그래밍 분야에서 문제를 풀기 위해 설계된 어떤 소프트웨어 프로그램에 대한 기능성을 정의하는 연구의 한 영역이다. 도메인 엔지니어링 이라고도 알려져 있다. 쉽게 말하자면 소프트웨어에서 도메인이란 소프트웨어를 통해 해결하고자 하는 관심사의 영역이라고 할 수 있다. 그리고 도메인 지식이란 해당 도메인 영역을 해결하기 위해 필요한 배경 지식이다. 예를 들어 ‘지하철 역과 노선을 관리하는 애플리케이션’을 만든다고 가정해 보자. 애플리케이션을 개발하기 위해선 ‘지하철 역’과 ‘지하철 노선’이라는 도메인이 필요하고..