Spring

0. 들어가기 전에 TaskScheduler를 활용해 자동적으로 리뷰 완료 상태로 변경하는 기능을 만들었습니다. 1. 필요한 이유 리뷰 랭킹을 구현하고 나니, 리뷰했지만 리뷰 완료 버튼을 누르지 않은 리뷰어들이 많았다. 글 상태가 리뷰 진행중이라고 되어있고, 리뷰 개수가 증가하지 않아 랭킹에 못 들어간 리뷰어들이 많았다! 또한, 리뷰어 평가도 이루어지지 않았다. 이 문제를 해결하기 위해 회의를 한 결과 리뷰 진행 중이면서 마감 기한이 지나면 3일 뒤에 자동으로 리뷰 완료 상태로 변경되도록 정책을 변경하기로 했다. 2. 구현 아이디어 그럼 어떻게 구현해야 할까? 가장 먼저 생각나는 건 아래처럼 스케줄러를 사용해서, 1분마다 조건에 맞는 게시글을 찾아 상태를 바꿔주는 것이다. @Scheduled(cron =..
0. 들어가기 전에 Redis를 도입하면서 테스트 방법이 필요했는데 이에 대해 고민한 글입니다. 1. Redis 테스트는 어떻게 해야할까? Reids를 도입하면서 테스트를 어떻게 해야할지에 대한 고민이 생겼다. 기존에는 MySQL 대신에 embeded h2를 사용해서 테스트를 했다. 하지만 redis를 도입하면서 이 방법은 사용할 수 없게 되었다. 찾아보니 레디스를 로컬에서 테스트하는 방법은 두 가지 방법이 있었다. 1.1 Embedded Redis //spring-data-redis compile('org.springframework.boot:spring-boot-starter-data-redis') //embedded-redis compile group: 'it.ozimov', name: 'embed..
0. 들어가기 전에 예전에 진행하던 프로젝트를 유지보수하던 중에 CORS 정책이 wildcard로 열려있는 것을 확인해 보안을 위해서 wildcard를 없애던 중 마주쳤던 문제입니다. 1. AS-IS @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*"); } 기존 Cors관련 메서드는 이런 식으로 와일드 카드로 열려있었다. 와일드 카드는 보안 상 안좋기도 하고 나중에 쿠키를 사용하려면 변경해야하기 때문에 이번 기회에 아래처럼 변경해보기로 했다. @Override public void addCorsMappings(CorsRegistry registry) { reg..
0. 들어가기 전에 LazyConnectionDataSourceProxy을 MySQL Replication 할 때 사용했는데, 어떤 원리로 동작하는지 알아보기 위해 글을 작성했습니다. 1. LazyConnectionDataSourceProxy란? LazyConnectionDataSourceProxy는 JDBC 커낵션이 실제 필요한 시점에 커넥션을 가져오도록하는 프록시 객체이다. 예시 코드로 살펴보자. @Service @Transactional public class LazyService { private final DataSource dataSource; public void lazy() { HikariPoolMXBean hikariPool; if (dataSource instanceof LazyConn..
바톤 팀이 Java17를 사용하는 이유 0. 들어가기 전에 우테코 팀 프로젝트에서 저희 팀이 자바 버전을 선택한 이유에 대해서 정리해보았습니다. 1. Java11 vs Java 17 자바 버전을 고르기 위해 후보가 몇 가지 있었습니다. 바로 Java 11과 Java 17입니다. 이외에도 Java 1.8과 Java 20도 후보에 올랐었습니다. Java 1.8은 Java 11에 비해서 부족한 함수(ex) List.of)를 가지고 있고, 기본 GC가 Parallel GC를 사용하므로 11부터 기본 GC로 채택된 G1 GC도 사용하지 않았기 때문에 탈락 했습니다. Java 20은 현재로서 가장 최신버전이기 때문에, 하위 버전의 장점을 모두 가지고 있고 Java 21로 변경하기 용이하다는 장점이 있었습니다. 하지..
[Spring] Spring Rest docs 적용해보기 0. 들어가기 전에 API문서를 Postman으로 만들었었는데, 설정이 바뀔 때마다 업데이트하기가 힘들다는 단점을 느껴서 Restdocs에 대해서 알아봤습니다. 1. Spring REST docs란? REST API의 명세에 대한 문서화 툴 API 문서화의 대표적 주자는 Swagger와 REST docs가 있습니다. 그 중에서 제가 REST docs를 더 선호하는데 이유는 다음과 같습니다. Swagger와 달리 Restdocs는 테스트 코드를 통해 작동하기 떄문에 테스트 코드를 필수적으로 작성해야 합니다. Swagger는 운영코드인 Controller 단에서 @Api나 @ApiImplicitParams와 같은 어노테이션을 통해 문서화를 해서 운영 ..
[Spring] HandlerMethodArgumentResolver 동작 원리 0. 들어가기 전에 ArugmentResolver을 사용해보고, 어느 시점에서 사용 되는지 알아보기 위해 정리했습니다. 1. HandlerMethodArgumentResolver란? 특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩해주는 인터페이스 컨트롤러에 있는 메서드 파라미터는 누가 넘겨주는 것일까? 우리는 @GetMapping, @PostMapping등이 붙은 메서드를 사용하면서, 메서드 파라미터 값에 @RequestParam, @RequestBody를 사용해서 값을 입력받는다. JSON을 파싱하고 파라미터에 값을 넣어주는 복잡한 연산들을 누가하는 것일까? 이 연산들을 하는 것은 흔히 얘기하는 ArgumentRe..
[Spring] Spring에서 DI하는 3가지 방법 0. 들어가기 전에 스프링은 POJO(순수한 자바 객체) 형태의 객체 지향 설계를 만족하기 위해 탄생했습니다. 그렇다면 순수하게 객체 지향적으로 어떻게 코드를 작성할까요? 스프링은 DI와 IoC를 사용하는데, 이번 글에서는 DI에 대해서 설명을 하겠습니다. 1. DI 란? DI는 Dependency Injection의 약자로, 의존관계 주입이라고 한다. DI는 스프링의 핵심 기능 중 하나로 관심사 분리를 할 수 있게 도와준다. '의존관계를 주입한다'라는 말을 살펴보자. 주입은 집어 넣는다는 것이라고 생각하면 되는데, 여기에서 말하는 의존관계는 무엇일까? 자바 예제 코드로 알아보자. 1.1 예제 public interface DiscountPolicy ..
쿠엔크
'Spring' 태그의 글 목록