legacy/Spring
-
[Spring] Spring AOP(Aspect-Oriented Programming)legacy/Spring 2024. 9. 28. 17:54
1. 스프링 AOP란?AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)이라고 부르며, 프로그램의 핵심 기능 외에 부가적인 기능을 분리해서 모듈화 하는 기법이다. 핵심 비즈니스 로직과는 직접적인 관계가 없는 로직들(ex. 로깅, 트랜잭션)이 코드의 여러 부분에서 반복될 수 있다. AOP는 비즈니스 로직과 상관없는 반복적인 코드들을 별도의 모듈로 관리하여 코드의 유지 보수를 쉽게 하고 핵심 비즈니스 로직에 집중할 수 있도록 한다.ex) @Transactional은 트랜잭션 처리라는 부가적인 기능을 애너테이션으로 적용하는 방식이다. 원래는 트랜잭션을 사용하려면 transaction.begin(), transaction.commit(), transaction.rollback() ..
-
[Spring] 스프링 이벤트, @TransactionalEventListenerlegacy/Spring 2024. 9. 9. 16:08
1. 스프링 이벤트(Spring Event)를 사용하는 이유스프링 이벤트(Spring Event)를 사용하는 이유는 서비스 간의 의존성을 줄이기 위해서이다.스프링 이벤트를 사용하기 전에는 OrderService가 (1)사용자의 주문 요청을 처리하고 (2)푸시 메시지 발송 및 (3)메일 전송을 처리한다. OrderService는 PushService와 MailService를 의존하게 된다.반면에 스프링 이벤트를 사용하면 OrderService는 사용자의 주문 요청을 처리하는 책임만 갖고, 스프링 이벤트가 푸시 메시지 발송과 메일 전송을 처리한다. OrderService는 주문 요청만 처리하기 때문에 푸시 메시지 발송 및 메일 전송에 대한 책임을 갖지 않는다. 2. 스프링 이벤트(Spring Event) 구..
-
[Spring] 서블릿 컨테이너(Servlet Container) 역할legacy/Spring 2024. 9. 2. 10:35
클라이언트로부터 HTTP 요청이 발생하면 웹 서버(ex. Apache, Tomcat, Nginx, ..)로 전달된다. 서블릿 컨테이너에는 여러 요청을 처리할 수 있도록 여러 개의 서블릿이 등록되어 있다. 서블릿 컨테이너는 웹 서버로부터 HTTP 요청을 받아, 이 요청을 처리할 수 있는 서블릿으로 전달한다. 서블릿(Servlet)은 HTTP 요청을 처리하고 응답을 생성하여 웹 페이지를 동적으로 생성하는 역할을 한다. 기본적으로 init(), service(), destroy()가 정의되어 있다.HTTP 요청이 들어오면 요청을 처리할 수 있는 서블릿을 찾는다.서블릿이 처음으로 사용된다면 해당 서블릿을 인스턴스화하여 메모리에 로드한다. 이후에 init()을 호출하여 서블릿을 초기화한다. 초기화 작업은 서블릿 ..
-
[Spring] java.lang.NullPointerException: save(...) must not be nulllegacy/Spring 2024. 7. 17. 23:05
1. Mock 테스트를 위한 라이브러리 추가Mock 테스트를 위하여 gralde에 아래를 추가하였다.// MockitotestImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0")testImplementation("org.mockito:mockito-core:4.0.0")testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") 2. 서비스 레이어 작성게시물을 작성하는 코드를 작성한다.@Service@RequiredArgsConstructorclass DiaryService( private val diaryRepository: DiaryRepository) { @Transactional fun..
-
[Spring] 다중 인스턴스에서 @Scheduled 문제와 ShedLock 사용하기legacy/Spring 2024. 7. 11. 13:43
1. 실행 환경Java 17Gradle 8.5SpringBoot 3.2.3 2. 기존 코드우리 프로젝트의 경우 게시물(Section)에 좋아요 기능과 관련한 API를 Redis를 사용하여 처리하고 있다. Redis에서 (key: SectionId, value:listof(userId))로 관리하고 있다.30초 간격으로 스케줄링을 통해 Redis에 좋아요 정보를 DB의 Likes 테이블로 옮긴다.// 30초마다 Redis 좋아요 기록을 DB의 Likes 테이블에 저장한다.@Scheduled(fixedDelay = 1000L * 30)@Transactionalpublic void saveLikes() { log.info("스케줄링 호츌"); // 정규식에 해당하는 모든 key를 조회한다. S..
-
[Spring] java.time.format.DateTimeParseException: Text '2024-05-25 14:33:07.049436' could not be parsed at index 10legacy/Spring 2024. 7. 9. 23:55
RedisRedis에서는 마지막으로 알림이 조회된 시간을 저장한다.hget Notification:notification lastNotificationTime"2024-07-09T23:39:39.101337"@Getter@RedisHash("Notification")@AllArgsConstructor(access = AccessLevel.PRIVATE)public class NotificationRedis { @Id private String notification; // key private LocalDateTime lastNotificationTime; // value public static NotificationRedis of(String notification, LocalD..