본문 바로가기
반응형

Develop/Spring+JPA59

[Mockito] LocalDateTime.now() 테스트하기 목차 서론 static method 조롱하지 않기 테스트 코드 작성 현재 시간을 구하는 클래스 LocalDateTime.now() 모킹 테스트 데이터 변경 Clock 이용하기 최종 선택 1. 서론 😄 `줍줍` 프로젝트에서는 내가 원하는 시간에 리마인드할 수 있도록 슬랙 메시지를 보내주는 리마인드 기능이 있습니다. 이 리마인더 목록을 조회할 때 이미 알림을 보냈던 리마인더는 조회할 필요가 없다고 판단했고 현재 시간을 기준으로 조회하기 위해 LocalDateTime.now()를 호출했습니다. 해당 로직을 어떤 식으로 테스트 코드를 작성할까 고민했던 일에 대해 포스팅해보려 합니다. 2. static method 조롱하지 않기 😡 Why doesn't Mockito mock static methods? Loca.. 2022. 8. 15.
[Spring] ResponseEntity vs DTO 🤔 서론 🤔 `줍줍` 프로젝트를 진행하며 반환값을 ResponseEntity로 반환하느냐, DTO를 반환하느냐 무엇이 더 좋을까? 에 대한 이야기가 나왔습니다. 이에 대해 다양한 사람들에게 조언을 구했고 많은 분들이 의견을 내주셨습니다 ㅎ.ㅎ 이를 정리하기 위한 글을 작성했습니다. 💥 ResponseEntity vs DTO 💥 HTTP body에 메시지를 담는 방법은 크게 2가지가 있습니다. 하나는 ResponseEntity를 이용하는 방법이고 하나는 @RestController를 사용해 DTO를 반환하는 방법입니다. controller에 아래와 같은 메서드를 작성했다고 가정하고 살펴보겠습니다. 1. ResponseEntity 반환 ResponseEntity의 빌더 패턴을 이용해 HTTP 상태코드 변경 .. 2022. 8. 11.
모든 요구사항을 한 엔드포인트로 처리하는 방법 🤔 서론 Java와 Spring으로 줍줍이라는 서비스를 개발하고 있다. 메시지 전송, 프로필 변경 같은 여러가지 슬랙 이벤트를 한 엔드포인트로만 관리해야 하는 상황이 발생했다. Front Controller? Handler Mapping? 뭘 사용해야 로직을 분기할 수 있지? 몇 개의 키워드만 주워듣고 팀원들 각자 해결할 방법을 생각해오기로 했다. 😂 상황 설명 "/test"라는 URL을 POST 메서드로 보내면 Controller의 testApi 메서드가 호출된다. HTTP Message Body에 담긴 데이터 중에 "type"이라는 값에 따라 실행해야 하는 로직이 다르다. @RestController @RequestMapping("/test") public class TestController { p.. 2022. 7. 8.
[Spring] CORS 에러 해결하기 💥 문제의 시작 Access to fetch at 'http://서버IP:8080/signup' from origin 'API호출한IP' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled 프론트와의 협업 미션을 하는 중에 위와 같은 에러.. 2022. 6. 13.
WHERE절 IN과 NamedParameterJdbcTemplate IN 절을 쓰다 만난 BadSqlGrammarException Spring은 다양한 종류의 JdbcTemplate을 지원하는데 개인적으로는 NamedParameterJdbcTemplate를 애용하는 편이다. NamedParameterJdbcTemplate에서는 아래 예제처럼 WHERE ~ IN (~)을 편하게 사용할 수 있다. public List findByIds(List productIds) { final String query = "SELECT id, name, price, image_url FROM product WHERE id IN (:productIds)"; SqlParameterSource source = new MapSqlParameterSource("productIds", productI.. 2022. 6. 8.
[Spring 5 프로그래밍 입문] chapter 5, 6 - 컴포넌트 스캔과 빈 라이프 사이클 목차 chapter 5: 컴포넌트 스캔 컴포넌트 스캔 @ComponentScan 컴포넌트 스캔 충돌 처리 chapter 6: 빈 라이프 사이클과 범위 컨테이너의 라이프 사이클 스프링 빈 객체의 라이프 사이클 프로토타입 빈의 라이프 사이클 Chapter 5 - 컴포넌트 스캔 📰 컴포넌트 스캔 : 스프링이 직접 클래스를 검색해 빈으로 등록해주는 기능 @Component로 등록 가능 어노테이션에 값을 주면 빈으로 등록 시 사용할 이름 지정 가능 값이 없을 경우 클래스 이름의 첫 글자를 소문자로 바꾼 이름으로 지정 기본 스캔 대상 @Component @Controller @Service @Repository @Configuration 책에서는 @Aspect도 스캔 대상이라고 되어있는데 이는 오해를 부를 수 있는.. 2022. 6. 4.
[Spring Boot] 내가 설정하지 않아도 동작하는 어노테이션 😊 서론 특정 어노테이션을 붙여야만 돌아가는 기능들이 있다. (ex: AOP를 사용하기 위해 @EnableAspectJAutoProxy 사용한다 등) 그런데 어노테이션을 달지도 않았는데 정상적으로 동작했다. Spring Boot에서 지원해주는 기능이라 예상하며 @SpringBootApplication 어노테이션을 열어보려고 한다. 결론을 바로 보고 싶은 사람들은 @SpringBootApplication은 생략하고 @EnableAutoConfiguration을 보자. 🚀 @SpringBootApplication main 메서드가 있는 클래스에 적용된 어노테이션이다. 간단히 살펴보자. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Docume.. 2022. 5. 28.
[Spring] @Aspect는 컴포넌트 스캔 대상일까? 많은 기술 블로그들이나 책을 보면 컴포넌트 스캔에 대한 이야기가 나온다. 컴포넌트 스캔은 @Component 어노테이션을 붙인 클래스 뿐 아니라 @Controller, @Service 등이 붙은 클래스도 컴포넌트 스캔 대상에 포함된다. 그런데 @Aspect 어노테이션도 컴포넌트 스캔의 대상이라고 설명한 곳이 많았다. 하지만 @Aspect가 붙은 클래스가 정상적으로 동작하려면 @Component 또는 @Bean 어노테이션을 이용해야 한다. 아래는 내가 작성한 테스트용 코드다. @Repository를 적용한 LineDao 클래스, @Aspect를 적용한 LoggerAop 클래스 두 개를 sout 해봤다. LineDao는 무사히 가져왔지만 LoggerAop에서는 해당 bean을 찾을 수 없다는 오류가 발생한다.. 2022. 5. 25.
[Spring 5 프로그래밍 입문] chapter 3, 4 - 의존 주입 목차 chapter 3: 스프링 DI 의존 주입; DI 객체 조립기 Spring과 DI chapter 4: 의존 자동 주입 @Autowired 어노테이션 @Qualifier 어노테이션 @Autowired 어노테이션 필수 여부 정하기 자동 주입 vs 수동 주입 Chapter 3 - 스프링 DI 💥 의존 주입; DI; Dependency Injection 여기서 의미하는 의존은 객체 간의 의존을 의미 의존: 변경에 의해 영향받는 관계 한 클래스가 다른 클래스의 메서드를 실행할 때 이를 의존한다고 표현 example1 - 의존 객체 직접 생성하기 의존 객체 직접 생성 의존 객체인 UserDao를 변경하고 싶은 경우 UserService에서 직접 수정 public class UserService { privat.. 2022. 5. 21.
반응형