일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- JPA
- cd
- CI
- builder-pattern
- Oracle
- superBuilder
- vuejs
- programmers
- Spring
- 프로그래머스
- Di
- CI/CD
- Vue
- Kubernetes
- k8s
- 코딩테스트연습
- map
- IntelliJ
- 해시맵
- 알고리즘
- java
- dabase
- docker
- SpringMVC
- 뷰
- 자바
- hibernate
- DevOps
- ORM
- CKA
- Today
- Total
목록개발/Spring (8)
문홍의 공부장
웹 애플리케이션을 개발하다 보면 하나의 클라이언트 요청에 대해 애플리케이션 전반에 걸친 특정 Context를 유지해야 할 필요성이 생긴다. 대표적으로 로깅 정보나 사용자 정보가 있다. 이 때 흔히 사용하는 방안은 ThreadLocal을 활용하는 것이다. 스프링에서 Web Request 가 오게 되면 하나의 쓰레드를 할당해서 해당 작업을 처리하게 된다. 이때 Thread 에 대한 정보를 ThreadLocal 에 저장하게 되면 해당 작업이 끝날 때 까지 모든 상황에서 context 를 유지하고 저장하고 찾아볼 수 있다. ThreadLocal은 쓰레드의 로컬 컨텍스트 변수로 Thread 가 존재하는 한 계속해서 남아 있는 변수이다. 작업 요청이 들어왔을때 하나의 쓰레드가 생성이 되고 작업이 끝나면 쓰레드가 없..
서비스 로직 간의 강결합이 주는 문제점 애플리케이션을 개발하면서, 한 번의 요청에 의해 2가지 이상의 기능을 수행하는 경우가 빈번하게 발생한다. 혹은, 간단하게 시작된 도메인 로직이 서비스가 확장됨에 따라 여러가지 추가 로직이 늘어나는 경우 역시 발생한다. 이러한 상황에서, 다수의 기능을 하나의 메서드에서 코드로 구현하면 기능 간 강결합이 생기게 된다. 강한 결합이 생기면 생길수록 로직을 분리해서 관리하기 어렵고, 특정 기능에 문제가 발생하였을 때 이를 처리하는 로직 역시 섞이게 된다. 클라이언트에서 회원 가입 요청이 발생하였을 때, 아래와 같이 프로세스가 진행된다고 가정해보자. (로직에서 사용한 메서드는 별도 구현이 되어있음을 전제한다.) 회원 등록 가입 축하 메일 발송 @Service @Require..
공통 응답 형식을 만들 때, 이전에는 컨트롤러 단에서 ResponseDto 를 객체를 이용하여 응답값을 필드에 set 하여 내려주었다. 이 경우, 모든 API 에 ResponseDto 를 직접 적어주어야 한다. 누락되는 케이스가 존재할 수 있고, 공통되는 영역이니 한 곳에서 관리하고자 하는 욕구가 생긴다. 스프링에서 제공하는 ResponseBodyAdvice 인터페이스를 이용하여 공통 응답 형식을 만들 수 있다. public interface ResponseBodyAdvice { boolean supports(MethodParameter returnType, Class> converterType); @Nullable T beforeBodyWrite(@Nullable T body, MethodParamet..
앞선 @Primary 와 @Qualifier (1) - 기본편 에서, 어노테이션의 기능과 사용법에 대하여 알아보았다. 이 내용을 바탕으로, 최근 실무에 적용하였던 사례를 정리해보고자 한다. 최근 multiple database 를 구성하는 태스크가 있어, 두 개의 데이터베이스 중 하나를 메인 DB 로, 다른 하나를 서브 DB 로 정의하여 환경을 구성하였다. 데이터베이스 스키마에 따라 myBatis 와 JPA 를 분리하여 사용하는 것으로 하였다. 이에 따라 메인 DB 는 myBatis mapper 를 스캔할 수 있도록 하는 설정을 추가하고, 서브 DB 에는 entityManager 에 대한 설정을 추가하였다. 1. 메인 DB 의 DataSource 설정 메인 데이터베이스 커넥션에 @Primary 를 사용하..
@Primary 와 @Qualifier 스프링 애플리케이션에서, 같은 타입의 빈을 두 개 이상 사용할 때 @Primary 혹은 @Qualifier 을 사용한다. 두 어노테이션의 기능과 공통점/차이점을 정리하고, 어떻게 사용하는 것이 효율적인 사용법인지 정리해보자 한다. Primary @Primary 는 같은 타입의 빈을 2개 이상 생성할 때, 하나의 빈에게 더 높은 선호도(higer preference) 를 부여하기 위해 사용한다. Simply put, we use @Primary to give higher preference to a bean when there are multiple beans of the same type. 왜 @Primary 가 필요할까? 스프링 컨테이너가 올라갈 때, 스프링은 컴..
많은 사이트에서 회원가입 시 이메일 인증을 요구하고 있다. 이메일로 인증번호를 발송하여 해당 인증번호를 입력하게 하는 경우도 있지만, 회원가입 시 인증 메일을 보내, 해당 메일에서 링크를 클릭하여 인증 및 회원가입을 완료하는 경우도 있다. 이전 팀 프로젝트에서 전자의 방법으로 이메일 인증을 구현해 보았으니, 이번 개인 프로젝트에서는 후자의 방법으로 구현하고, 그 내용을 정리해보려고 한다. 큰 틀을 동일하나, 인증키, 인증상태의 DB 저장 여부에 따라 약간의 차이가 있다. 인증상태를 어디에서 관리하느냐(프론트/백) 에 따라 DB 저장 여부가 결정된다고 볼 수 있다. (3-1 방법으로 했을 때에는 인증에 관한 데이터는 DB에 저장하지 않고, 유효성 검사를 통해 걸러냈다.) 1. 메일 인증 관련 라이브러리 다..
1. IoC(Inversion of Control) 제어의 역전(IoC)이란 한마디로 말하면 프로그램의 제어 흐름 구조가 바뀌는 것이다. (기존 개발자(사용자) 주도 => Spring 주도) 일반적으로, main() 같은 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정, 생성하고, 만들어진 오브젝트 내의 메소드를 호출하는 작업을 반복한다. 이런 구조에서 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다. 즉, 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다. 이에 반하여 IoC는 제어 흐름의 개념을 거꾸로 뒤집는다. 오브젝트는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않는다. 그리고 자신이 어떻게 만들어지고 어디서 사용되는지 알 수 ..
Spring Framework 란? 자바 엔터프라이즈 개발을 위한 ①오픈소스 ② 경량급 ③애플리케이션 프레임워크. ① 엔터프라이즈 개발 용이 : 개발자가 복잡하고 실수하기 쉬운 Low Level에 많이 신경 쓰지 않으면서 Business Logic 개발에 전념할 수 있도록 해준다. ① 오픈소스 : 소프트웨어(S/w) 혹은 하드웨어의(H/W) 제작자의 권리를 지키면서 원시 코드를 누구나 열람할 수 있도록 한 소프트웨어, 오픈 소스 라이선스에 준하는 모든 통칭을 일컫는다. (소스가 공개되어 여러 개발자가 플랫폼을 함께 개발, 구축, 보완해 나가는 시스템. ) ② 경량급 : 단순한 웹컨테이너에서도 엔터프라이즈 개발의 고급기술을 대부분 사용할 수 있다. ③ 애플리케이션 프레임워크 : 특정 계층이나 기술, 업무 ..