Java/Spring 56

[Spring] 동시성 이슈 및 해결 방안

동시성 두 개 이상의 세션이 공통된 자원에 대해 읽고 쓰는 작업을 하는 경우, 발생할 수 있는 문제 동시성 문제의 2가지 현상 일관성 없는 읽기 세션 2는 동시에 실행되고 있는 세션 1 때문에, 데이터에 접근하는 시점마다 다른 값을 읽게 됩니다. 이러한 문제는 “불변성”, 복사본을 이용하여 해결, 세션2가 최초로 데이터를 조회하는 경우, 해당 데이터를 복사하고 이후에도 계속 사용하는 것입니다. 하지만, JPA에서는 영속성 컨텍스트에 데이터를 1차 캐시에 캐싱하기 때문에, 일관성 없는읽기에 대한 문제는 없습니다. 갱신 손실 세션2에 의해 세션 1의 변경 사항이 무시되는 현상 이러한 동시성 문제를 해결하기 위한 방안 Optimistic Lock(낙관적 락) 자원에 Lock을 걸지 않고 충돌이 발생했을 때, ..

Java/Spring 2023.09.12

[Spring] Spring AOP

애플리케이션 로직은 큰 틀에서 핵심 기능, 부가 기능 2가지로 나눌 수 있습니다. 핵심 기능은 객체가 제공하는 비즈니스 로직이고, 부가 기능은 핵심 기능과 함께 사용되는 로그 추적 로직, 트랜잭션 기능과 같습니다. 부가 기능은 핵심 기능을 보조하기 위해 사용되는 기능입니다. 부가 기능은 여러 클래스에 걸쳐서 사용되는데 이를 횡단 관심사라고 하며, 하나의 부가기능이 여러 곳에서 동일하게 사용됨을 의미합니다. 하지만, 이러한 중복된 로직을 반복해서 사용하게 된다면 Refactoring에 있어서 많은 번거로움이 발생하게 됩니다. 즉, 이러한 문제점을 해결하기 위해 도입된 기술이 AOP 입니다. AOP가 생기면서 부가 기능을 핵심 기능에서 분리하고 한 곳에서 관리해 줄 수 있게 되었습니다. 그리고 이러한 기술을..

Java/Spring 2023.08.15

[Spring] Proxy Pattern, Decorator Pattern

Proxy Pattern, Decorator Pattern은 모두 Proxy 기술(클라이언트의 요청을 대신해서 처리해 주는 역할)이 적용됩니다. 이때, 서버와 프록시는 같은 인터페이스를 사용해야 하고, 의존관계를 서버에서 프록시로 변경해도 클라이언트 입장에서는 이러한 사실을 몰라야 합니다(프록시 체인). 앞서 설명드린 DI를 사용하면, 클라이언트의 코드 변경 없이 프록시를 주입할 수 있게 됩니다. 이제 이 둘의 차이와 역할에 대해 설명드리겠습니다. GOF 디자인 패턴에 따라 프록시의 역할은 2가지로 구분됩니다(intent에 의해 구분). 1. Proxy Pattern 권한에 따른 접근 차단, 캐싱, 지연로딩 2. Decorator Pattern 원래 서버가 제공하는 기능에 더해 부가 기능 수행 Proxy..

Java/Spring 2023.08.15

[Spring] Template Method Pattern, Strategy Pattern, Template Callback Pattern

스프링에서 사용되는 디자인 패턴인 템플릿 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴에 대해 알아보려고 합니다. 이들을 적용하는 이유는 좋은 설계를 위해서입니다. 좋은 설계란 요구 부가 기능(핵심 기능의 보조 기능)을 변경하지 않고 핵심 기능만 변경하게 설계하는 것입니다.(중복된 로직을 변경하지 않고, 변하는 것(비즈니스 로직)만 순수하게 바꾸어주는 것) 우선 좋은 설계에 한 발짝 나아갈 수 있는 템플릿 메서드 패턴에 대해 설명드리고 이와 비슷한 기능을 하고 있지만, 템플릿 메서드 패턴의 단점을 보완할 수 있는 전략 패턴, 전략 패턴에서의 템플릿과 콜백 부분을 강조한 템플릿 콜백 패턴까지 설명드리려고 합니다. GOF 템플릿 메서드 패턴 정의 부모 클래스에서의 템플릿을 정의하고, 일부 변경되는 로직을 자식..

Java/Spring 2023.08.09

[Spring] DI, IoC 컨테이너

DI, IoC, 컨테이너와 같은 개념들은 Spring Framework의 가장 기본적인 특징입니다. 1. IoC(Inversion of Control, 제어의 역전) 프로그램의 제어 흐름을 프로그래머가 직접적으로 제어하는 것이 아니라, 외부에서 관리하는 것 프로그래머가 객체를 생성할 때, 직접 생성하는 것이 아니라 스프링 컨테이너에서 생성하고 등록된 객체(Bean)를 가져오는 것입니다. 즉, 제어권을 본인이 아닌, 프레임워크(Spring 컨테이너)에게 넘겨줬기 때문에 IoC라는 개념이 도입됐습니다. 2. DI(Dependency Injection, 의존관계 주입) 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고, 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것 Sprin..

Java/Spring 2023.08.03

[Spring] SOLID 원칙에 대해 알아보자

SOLID 원칙이란 좋은 객체 지향 설계를 하기 위한 5가지 원칙입니다. SRP, OCP, LSP, ISP, DIP 총 5가지가 있는데, 이 원칙에 대해 알아보도록 하겠습니다. 1. SRP(Single Responsibility Principle, 단일 책임 원칙) 한 클래스는 하나의 책임을 가져야 하는 원칙 변경이 있을 때, 변경에 대한 파급효과가 적으면 SRP를 준수하고 있다는 것입니다. 2. OCP(Open/Closed Principle, 개방-폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있어야 되지만, 변경에는 닫혀 있어야 하는 원칙 (다형성) 다형성은 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있어야 하는 개념입니다. 클라리언트를 변경하지 않으면서, 서버의 구현 기능을 ..

Java/Spring 2023.08.03

[Spring] CORS(Cross-Origin Resource Sharing) 에러 해결

프로젝트에서 프론트 팀원분께서 api 연동을 하려는데 이러한 에러가 뜬다고 말씀해 주셨습니다. Access to XMLHttpRequest at 'http://ip주소/api/matches' from origin 'http://127.0.0.1:5173' 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 주어진 에러 메세지는 브라우저에서 발생한 CORS 관련 오류입니다. 서버에서 CORS 정책이 적절하게 구성되지 않은 경우에 클라이언트에서 요청한..

Java/Spring 2023.05.17

[Spring] Swagger3.0 버전 Authorize button 설정

인증(Authentication), 인가(Authorization)에 대해 설명드리겠습니다. 인증은 클라이언트 측에서 서버 측으로 요청한 사용자 정보가 올바른지 확인하는 과정입니다. (Login) 인가는 요청에 대한 권한이 있는지 판단하는 과정입니다. 만약 클라이언트의 요청에 대한 권한이 없다는 경우, HTTP 403(Forbidden) 상태 코드를 반환하게 됩니다. 클라이언트는 서버로부터 전달받은 토큰을 관리하며, Authorization Header에 Jwt 토큰을 담아 관리하게 됩니다. Postman과 같은 툴에서는 서버로 요청을 보낼 때, 매번 Bearer Token에 토큰 정보를 담아줘야 하는 불편함이 있습니다. 하지만, Swagger에서 Authorize 버튼에 관련한 설정을 활성화시킨다면 A..

Java/Spring 2023.05.12

[Spring] LocalDateTime 형식의 데이터를 @JsonFormat, @DateTimeFormat어노테이션을 적용하여 데이터 주고받기

팀플을 하던 도중 DB에서 데이터를 주고받는 경우 날짜 형식이 Array 형식인데, String으로 바꿀 수 없냐는 프론트측에서 질문을 받았습니다. 그래서 LocalDateTime을 String으로 어떻게 바꾸면 좋을지 생각하던 구글링 하던 도중 좋은 포스팅을 발견했습니다. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=varkiry05&logNo=221736856257 [spring] LocalDateTime 주고받기(Response, Request) 데이터베이스에서 날짜데이터를 로드할 때 날짜형식의 String 형태으로 구성하여 전달하는 경우가 있다. (... blog.naver.com Response에서는 클라이언트 측의 요..

Java/Spring 2023.05.10

[Spring] 이메일 인증을 구현하기 위한 설정 (SMTP, mail.properties)

오늘은 Spring 기반으로 회원가입 시 이메일 인증 코드를 발급해 주는 기능을 구현해보려고 합니다.해당 기능을 구현함으로써 보안성을 강화하고, 서비스의 신뢰성을 높일뿐더러, 스팸 및 악성 가입을 방지할 수 있습니다. 또한 Spring에서는 JavaMail 모듈이 워낙 잘 되어 있어서 해당 모듈을 활용해야겠다고 생각했습니다.  SMTP를 이용하여 메일 서버를 구축하고, 해당 프로젝트 내에서 MailConfig, mail.properties 설정을 통해 구현하는 과정에 대해 상세히 설명드리도록 하겠습니다. SMTP (Simple Mail Transfer Protocol)인터넷을 통해 이메일을 보내고 받는 데 사용되는 통신 프로토콜 Spring Mail ModuleJavaMail API를 추상화하여 편리한 ..

Java/Spring 2023.04.02