본문 바로가기

Spring19

Spring boot - thymeleaf를 통한 html 파일 다국어 이메일 전송 들어가기 프로젝트 진행 중 메일 전송 기능을 진행하고 있다. 문제는 글로벌 사용자를 대상으로 하고 있기 때문에, 언어별 html 파일이 존재해야 한다. 하지만 언어별 html 파일을 만들고 비즈니스 로직에서 분기점을 만드는 방법은 번거로운 방법이며 가독성이 떨어질 것이다. 그래서 MessageSource를 활용하려고 한다. html 파일은 하나만 만들어 두고, 언어별 messages.properties 파일 내 html 텍스트를 지정하는 것이다.  이 글에선 이메일 전송을 위한 thymeleaf를 통한 html 파일 작성 시 한국어, 일본어, 영어 버전으로 작성하는 과정을 담고 있다.  MessageSource에 대한 내용은 https://khdscor.tistory.com/133를 참고하길 바란다. S.. 2024. 9. 29.
MessageSource와 Locale을 활용한 다국어 에러 처리(with Spring boot) 들어가기 현재 진행하는 프로젝트는 한국인만이 아니라 외국인 대상으로도 출시를  목표로 하고 있다. 그렇기에 평소에 하던 것처럼 한국어로만 앱을 구성하는 것이 아닌, 다국어 버전으로 작성해야 한다. 에러 메시지를 사용자에게 전달할 때, 언어에 따라 분기점을 만드는 것을 생각했지만, 이는 복잡성을 증가시킬 것이다. 이런 경우를 위해 Spring boot에서는  'MessageSource' 객체와 'Locale' 객체를 활용한 다국어 기능을 지원해 준다. MessageSource는 Spring 프레임워크에서 다국어 지원을 위한 메시지 처리를 담당하는 인터페이스이며, 이를 통해 다양한 언어에 맞는 메시지를 쉽게 관리하고, 사용자의 Locale에 해당하는 메시지를 반환해준다.Locale은 특정 언어나 국가, 지역.. 2024. 9. 19.
Spring boot - @Async를 통한 메서드 비동기 실행 및 주의사항 이전 글(https://khdscor.tistory.com/131)에서 Spring boot에서 gmail smtp 서버를 통해 메일 전송 기능을 구현하였는데, 응답 시간이 오래 걸리는 것을 확인하였다.대략 4초가 걸렸는데, 사용자가 응답을 받는 데까지 기다리는 시간이 오래 걸리기 때문에 좋지 못한 상황이다. 그런데, 대부분의 사이트에서 인증 메일을 보낼 때는 대기 없이 바로 인증 메일을 전송했다는 응답을 받는다. 어떻게 이럴 수 있나 찾아보다가 @Async 어노테이션을 통해 특정 메서드를 비동기 방식으로 진행할 수 있다는 것을 알게 되었다.   @Async 어노테이션이 추가된 메서드는  별도의 스레드에서 실행되므로, 사용자는 해당 메서드가 종료되기 전에 응답을 받을 수 있고, 비동기로 동작하는 메서드는.. 2024. 8. 29.
OpenFeign을 통한 외부 API (With Spring Boot) 들어가기  최근 프로젝트를 진행하면서 비즈니스 로직을 수행하는 도중 외부 API를 호출해야 하는 기능을 구현해야 하는 경우가 있었다. RestTemplate, WebClient 등 다양하게 있겠지만, Spring Data Jpa와 비슷하게 인터페이스와 어노테이션 기반으로 코드를 작성하는 OpenFeign이라는 것이 눈길을 끌었다.  Spring Data Jpa를 자주 사용했던 나로서는 매우 직관적이고 간단하여 좋다고 생각하였고, 이번엔 OpenFeign를 사용해보기로 하였다.이 글에선 OpenFeign에 대해 공부한 내용과 적용 과정을 간단하게 작성한 글이다.OpenFeign을 포함하여 다른 외부 API를 호출하는 방법은 아래를 참고하길 바란다.https://jie0025.tistory.com/531 [.. 2024. 7. 13.
파일 업로드, 다운로드, 이미지 미리보기 구현(Spring boot With React) 들어가기  Spring boot로 프로젝트  도중 채팅방을 구현하면서 채팅 내용뿐만 아니라 파일을 업로드, 다운로드할 수 있도록 추가하려고 한다. 그러기 위해선 파일을 업로드 후 서버에서 파일을 보관하고, 다운로드 기능을 학습해야 한다. 이 글에선 간단한 프로젝트로 파일 업로드, 다운로드 기능을 Spring boot, React로 구현하는 과정을 담았다.HTTP를 통한 파일 업로드, 다운로드를 구현하였다. 업로드할 때는 MultiPartFile로 파일을 받고, 다운로드 시에는 byte[]와 같은 형태로 파일을 반환하도록 하였다.(또 다른 방법으로는 ResponseEntity가 있다고 하지만 이 글에서는 사용하지 않았다.)  java 17, spring boot는 3.2.3를 사용하였고 데이터베이스는 h2.. 2024. 5. 30.
Springboot 3.x.x 를 사용해보자 들어가기 최근 Springboot 프로젝트를 생성하기 위해 Spring.io(https://start.spring.io/)에서 다운을 받으려고 들어갔더니 아래와 같이 나왔다. Spring Boot의 버전과 Java 버전을 봐보자. Springboot는 3.x.x이고 Java는 최소가 17이다. 나는 Springboot 2.x.x 때 시작하였고 Java 버전은 항상 11 버전을 사용하였기에 어색한 모습이었다. 확인해 보니 Springboot 3.x.x는 22년 1월부터 정식 릴리즈 됐었고, 2.x.x 버전은 23년 11월까지 지원하는 것이었다. Springboot 프로젝트를 이전 버전으로 사용하려면 위의 방법으로 jar 파일로 다운로드하지 않고 gradle 혹은 maven에서 직접 하면 되기는 하지만, 계.. 2024. 1. 24.
springboot(jpa, mybatis) - page 객체 및 커버링 인덱스를 사용해보자! 들어가기 평소 프로젝트를 진행할 때는 페이지 처리를 할 때, 페이지 처리 로직이나 객체를 직접 만들어서 사용했었다. 하지만 최근 Page 객체라는 것이 있고 spring에서 제공하고 있다는 것을 알았다. Page 객체를 사용하면 다음페이지가 있는지, 전체 사이즈가 몇인지, 이전 페이지가 있는지 등 구현하기 귀찮은 여러 메서드들을 제공해 주니 유용하게 사용된다고 한다. 페이지 처리를 하는데 있어 Page 객체를 사용 안 해볼 수는 없기에 직접 사용해 보기로 하였다. 이 글은 페이지 객체를 사용한 경험담을 담고있다. 처음에는 Page 객체니, PageRequest 니 Pagable이니 PageImpl 등 뭔 Page 하나에 관련된 객체가 너무 많아서 어디서부터 접근해야 할지 막막했었다. page처리를 위해 .. 2023. 8. 24.
springboot service 계층: 인터페이스와 여러 구현체로 구현(공통 메서드 분리) 들어가기 이 글은 개인적인 생각을 포함하여 작성한 글이다. 나는 프로젝트를 할 때 항상 service 계층에 class 하나로만 구현을 하였었다. 하지만 다른 사람들이 한 프로젝트에서는 service 명칭으로 된 interface와 serviceImpl 명칭으로 된 class 구현체로 구현되어 있었다. 이는 디자인 패턴 중 전략 패턴을 적용한 것이라고 할 수 있다. 이게 과연 의미가 있나 싶어서 지금까지 적용하지 않았었는데 마침 리펙토링을 하면서 한번 알아보고 적용해 보기로 하였다. 이 글에서는 impl을 쓰는 이유와 간단 적용, 인터페이스와 여러 구현체일 때 공통 메서드 처리 등을 다룰 예정이다. Service 계층에서 인터페이스와 구현체의 구분은 왜 생긴 것인가? 처음 인터넷에 'spring serv.. 2023. 7. 15.
Java Springboot AOP를 통한 로그 출력(메서드 이름을 활용) 이 글에서는 Springboot 프로젝트를 진행하면서 AOP를 통해 로그 출력을 하는 과정을 담았다. AOP에 대한 개념적인 부분은 별도의 참고 URL로 표기하였고 활용 위주로 작성하였다. 글을 작성하기 전 간단하게 AOP를 통해 로그 처리를 한 소감을 말하자면 정말 말도 안 되게 유용한 기능이라고 생각한다. 처음에는 그냥 메서드마다 로직 사이에 log.info를 추가하기만 하면 되는 것을 뭐 하러 코드까지 늘리면서 다른 AOP 클래스를 생성할까? 하고 의구심이 들었다.하지만 구현해놓고 수정할 일이 있어 메서드를 수정할 때 log출력에 관한 부분은 하나도 신경을 쓰지 않고 메인 로직을 수정할 수 있었다. 이게 AOP를 사용하는 진정한 장점이라는 것을 깨달았다.다음 프로젝트에서도 계속 AOP를 통해 로그처.. 2023. 7. 8.