개인 학습 메모장 (104) 썸네일형 리스트형 RestTemplate -> WebClient 로 리팩토링 문제상황 RestTemplate을 이용하여 카카오 페이 API와 통신하여 결제를 구현하였다. 하지만 RestTemplate이 곧 deprecated 된다는 소식과 WebClient 비동기 및 리액티브 방식을 제공해 성능적으로 뛰어나다는 사실을 알고 이를 사용하게 되었다. 간단하게 각각의 특징을 살펴보자 RestTemplate 특징 통신을 단순화하고 RESTful 원칙을 지킨다 멀티쓰레드 방식을 사용 Blocking 방식을 사용 WebClient 특징 싱글 스레드 방식을 사용 Non-Blocking 방식을 사용 JSON, XML을 쉽게 응답받는다. 리액티브 프로그래밍 유연한 API 다음은 내가 적용했던 restTemplate을 사용하는 예시이다. public HttpEntity requestKaKaoToS.. 팩토리 메소드 패턴으로 리팩토링 문제상황 카카오 페이를 통해 결제를 구현했다. 코드는 전적으로 카카오페이에 의존한 상태이다. 문제는 새로운 결제수단이 등록 되었을 때 생긴다. 결제 코드가 카카오 페이에 전적으로 의존하여 기존의 코드를 다 바꿔야 한다는 문제점이 생긴다. 이러한 문제점을 해결하기 위해 팩토리 메소드 패턴을 이용하여 리팩토링 하였다. 이유 여러가지 디자인 패턴 중 팩토리 메서드 패턴을 이용한 가장 큰 이유는 객체 생성을 캡슐화 하기 때문이다. 객체 생성을 캡슐화를 통한 얻을 수 있는 이점은 다음과 같다. 확장성 객체 생성 코드를 수정하지 않고도 새로운 객체를 추가하거나 기존 객체를 변경할 수 있다. 이는 시스템의 확장성을 높이는데 큰 장점이 된다. 코드 중복 최소화 객체 생성 코드를 중복해서 작성하는 일이 없어지고, 코드의.. 낙관적 락을 적용하여 동시성 문제 해결하기 문제상황 여러명의 이용자가 동시에 주문을 진행하거나 주문을 취소할 경우 즉 멀티 스레드 환경에서 상품의 재고는 안정적으로 변화하는가에 대한 문제를 직면하게 되었다. 결과는 역시나 실패.. 해결방법 이러한 상황에서 내가 선택한 해결 방법을 소개하고자 한다. 선택지는 다음과 같이 있었다. 1. 비관적 락 2. 낙관적 락 3. 네임드 락 4. Redis의 Lettuce 또는 Redisson 라이브러리 활용 각 방법에 대한 장단점을 비교하는 글이 아니기에 내가 선택한 낙관적 락에 대해서 설명하도록 하겠다. 설명하기에 앞서 낙관적 락을 선택한 이유를 설명하겠다. 우선 mysql dbms를 이용하고 있는 상황이었기 때문에 Redis를 적용시키지 않았다. 또한, 상품중 같은 상품을 여러 사용자가 같은 시간에 주문하거.. @Transactional과 AOP 들어가며 지난 AOP에 관한 글에 이어 내가 겪은 문제와 이를 해결하는 과정을 담아 보겠다. 그 전에 스프링에서 @Transactional을 처리하는 과정을 먼저 짚고 넘어가보자 @Transactional과 AOP 트랜잭션 처리를 위한 @Transactional 어노테이션은 Spring AOP의 대표적인 예이다. @Transactional 또한 Proxy 형태로 동작한다. 동작과정 target에 대한 호출이 들어오면 AOP proxy가 이를 가로채서(intercept) 가져온다. AOP proxy에서 Transaction Advisor가 commit 또는 rollback 등의 트랜잭션 처리를 한다. 트랜잭션 처리 외에 다른 부가 기능이 있을 경우 해당 Custom Advisor에서 그 처리를 한다. 각 .. 자바 ORM 표준 JPA 프로그래밍 #5(프록시와 연관관계) 들어가며 엔티티를 조회할 때 연관관계에 있는 Entity까지 조회를 하는 것은 효과적이지 않다. JPA는 이러한 상황을 위해 지연 로딩을 지원하는데 연관관계에 있는 엔티티에 프록시 객체를 집어 놓았다가 실제로 사용시 엔티티를 집어 넣는다. 프록시 먼저 프록시에 대해서 살펴보도록 하자. 엔티티를 조회할 때 항상 연관된 엔티티를 사용하지는 않는다. 예를들어 지연로딩을 설정한 경우 엔티티 조회시 연관 엔티티에는 프록시 객체가 들어있다. 연관 엔티티를 상속받은 프록시 객체를 통해 데이터베이스에 쿼리를 해당 엔티티를 사용시에만 날릴 수 있게 한다. 프록시 초기화 과정 1. 프록시 객체에 접근을 시도하게 되면 실제 데이터를 조회한다. 2. 프록시 객체가 초기화 되어있지 않으면 영속성 컨텍스트에 실제 엔티티 생성을 .. AOP의 개념 배경 위의 그림과 같이 프로그램을 작성하다 보면 로깅, 보안 등 공통적으로 나타나는 기능들이 있다. 예를들어 DB커넥션을 할때 DB 커넥션을 연결하고, Statement객체를 세팅하고 쿼리문을 실행하고 예외처리를 실행하는데 이때 DB연산을 제외한 코드는 어떤 데이터베이스 연산을 하든 공통적으로 나타나는 코드이다. 이렇든 코드는 횡단관심사 + 핵심관심사로 이루어져 있는데 이런 횡단 관심사를 따로 분리해서 한 곳에서 관리 하는것을 AOP라고 한다. 상세 이때 어떤 횡단 관심사를 언제 어디에 사용할까? 라는 의문점이 생기게 되는데 이때 나온 개념이 Advice, JointPoint, PointCut이다. 간단하게 각각 무엇인지 살펴보자 Advice 어떤 부가기능을 언제 사용할지에 대한 정의이다. 종류로는 다음.. Session, Cookie, Cache 배경 로그인을 하거나, 브라우저에 아이디를 기억해 두거나, 광고 팝업에 대해서 보지 않음을 선택하거나 등등 클라이언트의 정보를 기억해야 하는 stateful한 서비스가 점점 늘어나고 있다. 하지만 HTTP의 특성상 기본적으로 connectionless, stateless한 특성을 갖고 있기 때문에 서버는 클라이언트의 정보를 기억할 수 없다. 이러한 HTTP의 약점을 극복하기 위에 쿠키와 세션이란 개념이 도입되었다. 쿠키 쿠키란 웹 서버가 브라우저에 지시하여 로컬컴퓨터 파일 또는 메모리에 저장하는 작은 데이터 파일이다. 쿠키에는 다음의 두 가지의 종류가 있다. Session-Cookie 메모리에 저장되며 브라우저 종료시 삭제된다. Persistent-Cookie 디스크에 저장되며, 브라우저를 닫거나 컴퓨터.. 자바 ORM 표준 JPA 프로그래밍 #4(연관관계) 들어가며 엔티티들은 대부분 다른 엔티티와 연관 관계가 있다. JAVA에서는 연관관계를 참조를 이용해서 맺고, 데이터베이스는 외래키를 이용해서 맺는다. 따라서 JPA를 이용해 연관관계를 맺기 위해서는 객체의 참조와 테이블의 외래키를 매핑해야 한다. 연관관계 핵심 키워드 방향 단방향, 양방향이 잇다. 이는 외래키 개념이 없는 객체 관계에서만 존재하는데 간단히 객체 A가 B를 참조하지만 B는 A를 참조하지 않는 것이 단방향 둘 다 참조하는 것이 양방향 관계이다. 다중성 1:N, N:1, N:M의 관계가 있다. 예를 들어 회원과 팀은 1:N, 팀과 회원은 N:1, 상품과 주문의 관계는 N:M이다.(한번에 여러 상품을 주문할 수 있고, 상품 또한 서로 다른 주문에 포함 될 수 있으므로) 연관관계 주인 객체를 양방.. 이전 1 ··· 6 7 8 9 10 11 12 13 다음