자바생
article thumbnail
[kerdy] EventListener & TransactionalEventListener를 통해 문제 해결해보기 (적용편)
Spring 2023. 8. 20. 21:42

글을 쓰게 된 이유 이 글은 (1) 편과 이어집니다. (1) 편은 예제를 통해서 적용해 보았고, (2) 편은 이제 실제 커디 프로젝트에 적용해보려고 합니다. 이 글은 이제 팀원들을 이해시키기 위해서 작성해보려고 합니다. 그래서 (1) 편과 중복된 얘기가 있을 수 있습니다! 감안하고 봐주시면 감사하겠습니다. 기준 테스트 @Test @DisplayName("publish(Comment) : 댓글 이벤트가 성공적으로 발행되면 UpdateNotification이 성공적으로 저장될 수 있다.") void test_publish_comment() throws Exception { //given final Event event = eventRepository.save(EventFixture.인프콘_2023()); f..

article thumbnail
EventListener & TransactinoalEventListener를 통해 문제 해결해보기 (예제편)
Spring 2023. 8. 20. 02:31

아래 코드는 GitHub 에서 보실 수 있습니다. 글을 쓰게 된 이유 우아한테크코스(이하 우테코)에서 진행한 프로젝트 ‘커디’에서 알림 서비스를 개발했습니다. 해당 서비스를 개발하다보니 아래와 같은 궁금점들이 생겼습니다. 서드파티인 파이어베이스를 통해 알림을 보내게 되면 기존 로직에 비해 오래 걸릴 텐데, 동기적으로 수행한다면 사용자가 알림이 전송될 때까지 기다려야 하는 걸까? 만약에 애플리케이션 로직(알림 저장)은 성공했지만 파이어베이스 서버가 잘못되면 알림 전송이 실패될 텐데, 즉, 같은 트랜잭션 내에 묶여있으면 실패로 될 텐데 이게 맞는 걸까? 사용자 입장에서는 정확하게 알림을 저장했지만, 파이어베이스 서버가 잘못되어 알림이 사라지는 경우가 맞는 걸까? 등과 같은 다양한 생각이 들었습니다. 그래서 ..

article thumbnail
[kerdy] AOP, ThreadLocal을 사용하여 N+1 detector 만들어보기
Spring 2023. 8. 19. 19:54

글을 쓰게 된 이유 이번 글은 커디 팀뿐만 아니라 우아한테크코스(이하 우테코) 크루들에게 모두 도움이 되지 않는 글일까 생각합니다. 레벨 3 프로젝트를 진행하면서 기존에 JPA를 사용했던 분들, 처음 사용해 보신 분들이 있으실 겁니다. 기존에 사용했던 분들은 N+1을 알고 있지만 기능 만들기에 급해서 일단 구현 먼저 하셨을 것이고, 처음 사용해 보신 분들은 N+1 들어는 봤는데 이걸 어떻게 찾는 거지?라는 분들이 계실 거예요. 레벨 3가 끝나고 N+1을 해결해야 하는데 만든 기능들이 너무 많아서 API 호출하고 나서 로그에 찍힌 쿼리들을 하나하나 읽기 힘들더라고요,, 그래서 이 부분을 어떻게 해결할 수 있을까 생각해 보니 AOP(프록시)를 통해서 해당 API에서 쿼리의 개수를 측정할 수 있는 N+1 de..

article thumbnail
[kerdy] Spring Boot + Firebase 를 통해서 알림 기능 만들어보기
Spring 2023. 7. 31. 17:18

글을 쓰게 된 이유 이번에 우아한테크코스에서 커디라는 팀으로 프로젝트를 시작하게 됐습니다. 개발 관련 컨퍼런스들을 조회할 수 있고, 다른 사람들에게 같이 가기 요청을 할 수 있습니다. 이때, '같이 가기 요청'에서 알림 기능이 필요했습니다. 알림 기능을 구현하면서 Firebase를 왜 사용하게 됐는지, 어떻게 사용하는지 등 팀원들에게 공유하기 위해서 해당 글을 작성했습니다. 왜 firebase인가? 알림 기능을 구현하는 방법은 웹소켓, SSE, Polling 등이 있지만 왜 firebase를 사용했을까요? 현재 우테코의 데모데이 간격은 2주이기 때문에 새롭게 기능을 만들기에는 일정을 맞출 수 없다고 생각했습니다. 그래서 새로운 바퀴를 만들기보다는 존재하고 있는 바퀴를 아름답게 사용하기 위해서 fireba..

article thumbnail
@Validated vs @Valid
Spring 2023. 6. 14. 12:26

글을 쓰게 된 이유 레벨 2 장바구니 미션을 진행하면서 입력에 대한 유효성 검증을 할 때, 크루들마다 @Valid, @Validated 를 사용하고 있어서 둘은 어떤 차이가 있는지 학습해 보고자 글을 작성했습니다. dependency bean validation 을 사용하기 위해서는 아래와 같은 의존성을 추가해줘야 합니다. implementation 'org.springframework.boot:spring-boot-starter-validation' 왜 사용할까? 두 어노테이션 모두 유효성 검사를 편하게 하기 위해서 사용합니다. 다만 @Valid는 Java Bean 유효성 검사 사양의 일부로 javax 패키지에 존재합니다. @Validated는 스프링 자체에서 위 @Valid의 응용으로 스프링과 함께 ..

article thumbnail
@JdbcTest 때는 왜 schema.sql이 읽히지 않을까?
Spring 2023. 6. 9. 10:05

글을 쓰게 된 이유 JdbcTemplate을 사용하는 Dao 계층을 테스트하기 위해서 @JdbcTest 어노테이션을 사용하여 테스트를 작성했습니다. 이때 test 관련 yml 파일에서 DB url을 url: jdbc:h2:mem:testdb;MODE=MySQL 을 설정해 주었습니다. 하지만 schema.sql을 읽는 중에 H2 데이터베이스에 올바르지 않은 스키마라며 계속해서 테스트가 진행되지 않았습니다. 결론적으로는 제가 설정한 yml 파일을 읽지 않고, 다른 url을 가지고 있었습니다. 그러면 @JdbcTest를 사용하면 왜 제 yml을 읽지 않는 것이고, 설정된 yml 파일을 읽게 하려면 어떻게 해야 하는지 학습해 보았습니다. @JdbcTest 먼저 JdbcTest 어노테이션을 보니 많은 어노테이션들..

article thumbnail
Method Arguments 들의 동작 방법
Spring 2023. 4. 25. 11:11

글을 쓰게 된 이유 스프링 미션을 하면서 HTTP GET 요청 시, 파라미터(쿼리 스트링)를 객체에 바인딩해주는 어노테이션이 어떤 어노테이션인지 알아보기 위해 글을 작성하게 됐습니다. ProductDao 에서는 @JdbcTest를, ProductQueryService , ProductCommandService 에서는 @SpringBootTest를 통해서 통합 테스트를 하고 있습니다. 먼저 코드를 보겠습니다. public class GameInfoRequest { @Size(min = 2) private String names; @Positive private int count; public GameInfoRequest() { } public String getNames() { return names; }..

article thumbnail
Spring ExceptionHandler, ResponseStatus 동작 과정
Spring 2023. 4. 22. 21:33

글을 쓰게 된 이유 @ExceptionHandler, @RestControllerAdvice, @ControllerAdvice, @ResponseStatus를 사용하여 스프링에서 exception 처리하는 방법을 알게 됐습니다. 해당 어노테이션들이 어떻게 동작이 되는지, 처리되는지 알아보고자 디버깅을 해보았습니다. 어디에서 breakpoint? 공식문서에서 아래와 같이 DispatcherServlet 안에서 HandlerExceptionResolver 를 통해서 처리된다고 나와있기 때문에 breakpoint를 쉽게 찾을 수 있었습니다. Support for @ExceptionHandlermethods in Spring MVC is built on the DispatcherServlet level, Han..

article thumbnail
Spring @Async
Spring 2023. 1. 13. 20:21

글을 쓰게 된 이유 동기, 비동기를 이론으로 공부하고 실제로 사용해 보아야겠다는 생각이 들어서 Spring에서는 비동기 처리를 어떻게 하는지 궁금하여 학습하게 됐습니다. 비동기 처리의 대표적인 예시 중 하나인 이메일 인증을 Spring을 사용하여 처리해 보도록 하겠습니다. dependency implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-mail' //메일 관련 의존성 implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.p..

article thumbnail
HikariCP란 무엇일까?
Spring 2022. 10. 27. 01:43

글을 쓰게 된 이유 항상 Spring Boot를 실행하면 HikariPool start, shutdown과 같은 로그를 보신 적이 있으실겁니다. 매번 볼 때마다 뭐지? 하며 궁금해했지만, 영한님 DB 강의를 듣다가 hikari가 커넥션 풀 오픈소스 라는 것을 알게 되었고, 더 깊게 공부해보고자 글을 작성하게 됐습니다. Connection pool이 무엇인가요? WAS에선 DB 연결을 위해 Connection을 해야합니다. 하지만 Connection을 하기 위해서는 TCP/IP 통신으로 매 연결마다 많은 리소스를 필요로 하기 때문에 미리 Connection을 가진 객체들을 Connection pool에 보관했다가 연결을 필요로 하면 pool에 있는 Connection 객체를 사용합니다. 그래서 따로 Con..

@Scheduled를 사용하여 API를 주기적으로 호출
Spring 2022. 6. 7. 02:37

YAPP 프로젝트를 진행하는 중에 현재 시간 기준으로 모임 종료 시간이 지났을 경우 모임을 종료시켜야 할 필요가 있었다 해당 기능은 스프링에서 제공하는 @Scheduled를 이용하여 구현할 수 있었다 스케줄러를 어떻게 사용했는지 기록한다 Implementation 현재 시간 기준으로 모임 종료 시간이 지났을 경우 모임을 종료시켜야 한다 How 모임 종료 시간이 현재 시간보다 지나있을 경우 모임의 status를 모임 종료로 변경 스프링에서 제공하는 스케줄러를 사용해보자! Scheduling 적용 @EnableScheduling SpringBootApplication이 붙은 클래스에 @EnableScheduling을 붙인다 @EnableJpaAuditing @SpringBootApplication @Enab..

article thumbnail
MapStruct
Spring 2022. 5. 30. 13:48

MapStruct java mapping framework는 여러 가지가 있다 대표적으로 MapStruct와 ModelMapper가 있는데, 대부분 MapStruct를 사용한다 아래는 구글 트렌드에서 캡처한 자료 그 이유는 “속도” 차이가 월등히 나기 때문이다 ModelMapper는 매핑이 일어날 때 리플렉션이 발생 MapStruct는 컴파일 시점에서 annotation을 읽어 구현체를 만들어내기 때문에 리플렉션이 발생하지 않는다 (리플렉션은 구글링!) modelmapper는 변환할 때마다 맵핑할 객체를 계속해서 만들어내고(런타임), mapstruct는 빌드 시점에 구현체를 하나 만들어서 계속해서 그 구현체를 사용하기 때문에(컴파일) mapstruct가 더 시간이 빠르지 않을까? 그렇다면 MapStruc..

728x90

검색 태그