일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Web
- restTemplate
- db
- @Valid
- 데이터베이스
- java
- NotBlank
- @SpyBean
- Firebase
- @MockBean
- 트랜잭션
- 디자인 패턴
- Service Locator 패턴
- Effetive Java
- Effective Java
- FCM
- @ControllerAdvice
- deleteById
- Proxy Patter
- Service Locator
- SQL 삽입 공격
- Connection Pool
- JPA
- Spring Boot
- NotEmpty
- Item04
- 플라이웨이트
- 이펙티브 자바
- multi module
- springboot
- Today
- Total
목록springboot (11)
NoTimeForDawdling
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dT05RV/btrfhdxyyb6/ZPKsy2Uw8G7LasvGMLxROk/img.png)
이전 포스팅에서 Device Token을 통해 FCM Push 메시지 보내는 방법에 대해 설명했었다. 이번에는 Topic이라는 개념을 통해 메시지를 보내는 방법에 대해 설명하고자 한다. 설명하기에 앞서 해당 포스팅(FCM Push 메시지 보내기)에 정리한 Firebase 관련 설정을 해줘야 한다. build.gradle Firebase 설정을 해줬다면 build.gradle에 다음 내용을 추가하자. 다음으로 FirebaseConfig를 작성하기에 앞서 FcmSubscribeService 코드를 작성했다. @Service public class FcmSubscribeService { public String subscribeToTopic(List tokens, String topic) { ApiFuture..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/JcsdX/btre33Pd6Fd/PJXEKkklOgYNZYQGlrATh0/img.png)
푸시 알림은 Server에서 유저의 device로 정보를 보내는 것을 말한다. 구글이 제공하는 Firebase Cloud Messaging(FCM)을 이용하면, 서버와 같은 외부에서 내가 소유한 앱이 설치된 기기로 1개 이상의 메시지를 전송할 수 있다. FCM은 완전히 무제한으로 무료 제공된다. 크로스 플랫폼을 지원하여 Android, iOS, Chrome 기기에 메시지를 전송할 수 있다. 이번 포스팅에서는 Spring Boot 기반 프로젝트에서 FCM을 이용한 메시지 전송 방법을 적어보려 한다. Firebase 설정 Firebase에서 앱 서버로 푸시를 보내려면 Access Token을 발급받아야 한다. 우선 Firebase 콘솔에 접속하여 메시지를 전송할 앱을 선택한다. 없다면 앱을 새로 만들어야 한..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cdzqSM/btq7ucUkIJQ/twkiVrQaFLk29NKdkkzHSK/img.png)
이벤트 사용방법을 알아보기 전에 이벤트에 대해 간단히 알아보자. 이벤트(Event)란? 이벤트는 '과거에 벌어진 어떤 것'을 뜻한다. 예로, 주문을 취소했다면 '주문을 취소했음 이벤트'가 발생했다고 할 수 있다. 이벤트가 발생한다는 것은 상태가 변경됐다는 것을 의미한다. 즉, '주문 취소 이벤트'가 발생한 이유는 주문이 취소 상태로 바뀌었기 때문이다. 이벤트가 발생하면 그 이벤트에 반응하여 원하는 동작을 수행하는 기능을 구현하면 된다. 이벤트 필요성 강결합 문제 어느 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 이때 주문을 취소하는 로직과 환불을 위한 로직이 모두 섞이게 된다. 이렇게 서로 강한 결합으로 묶여있으면 코드도 복잡해지고, 나중에 유지보수가 힘들어질 수 있다. 트랜잭션 처리 문제 환불 기..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/blfbTv/btq4XbCLaH5/HEhKL1aY5cpsc8xB5Jqc3k/img.png)
API를 요청할 때 request body로 들어는 paramter에 대해 문자열 검증하는 방법으로 @NotNull, @NotEmpty, @NotBlank가 있습니다. 이 3가지 Annotation은 비슷해 보이지만 조금씩 다릅니다. 오늘은 이 3가지 Annotation의 차이점에 대해 확실하게 알고 넘어가 보겠습니다. 해당 포스트에서 사용할 DTO는 다음과 같습니다. @Getter @NoArgsConstructor public class ValidationDto { @NotNull private String notNull; @NotEmpty private String notEmpty; @NotBlank private String notBlank; } @NotNull @NotNull은 말 그대로 null..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bdx0ND/btq3Cz04v5T/QJHMYx4R9hSwjOiUsF2nP1/img.png)
오늘은 @ControllerAdvice를 이용해서 @Valid시 발생하는 에러를 처리해보겠습니다. @Valid 사용법은 여기에 자세히 나와있습니다. @ControllerAdvice란? @ControllerAdvice는 @Controller 전역에서 발생할 수 있는 예외를 잡아 처리해주는 애너테이션입니다. 자 그럼 이제 코드를 통해 알아보겠습니다. ExceptionController.class @RestControllerAdvice public class ExceptionController { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handelValidationExceptions(MethodArgument..
오늘은 Spring Boot에서 RestTemplate Connection Pool을 설정하는 방법에 대해 알아보겠습니다. RestTemplate은 기본적으로 Connection Pool을 직접적으로 지원하지 않기 때문에 매번 RestTemplate를 호출할 때마다, 로컬에서 임시 TCP 소켓을 개방하여 사용합니다. 이렇게 사용된 TCP 소켓은 TIME_WAIT 상태가 되는데, 요청량이 엄청나게 많아진다면 이러한 소켓들은 재사용될 수 없기 때문에 응답이 지연될 수밖에 없습니다. 하지만 RestTemplate의 내부 구성에 의해 Connection Pool을 설정할 수 있습니다. RestTemplate에서 내부적으로 사용되는 HttpClient를 이용하면 됩니다. RestTemplate.class /** ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/wvYRX/btq03uTQVzb/7tOdPZiid0LIb6nR0J7NGK/img.png)
Spring Boot에서 의존성 주입 방법으로 3가지가 있습니다. 지금부터 스프링의 의존성 주입 방법에 대해서 알아보겠습니다. 1. 생성자 주입(Constructor Injection) 생성자 주입 방법은 Spring framework reference에서 가장 권장하는 방법입니다. @Service public class SampleService { private final SampleRepository sampleRepository; @Autowired public SampleService(SampleRepository sampleRepository) { this.sampleRepository = sampleRepository; } } 생성자에 @Autowired 애너테이션을 붙여 의존성을 주입받을 수..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cMOiS8/btqXXVmQNZO/SI1dFYmN61qMD9n2HkRHK1/img.png)
Spring IoC 컨테이너를 알아보기 전에 스프링 컨테이너가 무엇인지에 대해서 알아보겠습니다. 컨테이너 Servlet 컨테이너 Servlet 컨테이너는 Servlet의 생성, 초기화, 소멸 등 Servelet의 생명주기를 관리합니다. 개발자들이 직접 Servlet을 생성하고 서비스하지 않습니다. EJB 컨테이너 EJB의 생성, 초기화, 소멸 등 EJB의 생명주기를 관리합니다. 컨테이너란? Servlet, EJB 컨테이너와 같이 컨테이너는 보통 인스턴스 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 합니다. 다시 말해, 컨테이너란 프로그래머가 작성한 코드의 처리과정을 위임받은 독립적인 존재입니다. 컨테이너는 프로그래머가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 ..