전체 글 45

Session vs Cookie vs JWT

http 프로토콜 환경은 Connectionless, stateless 한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 합니다. 이러한 특성을 보완하기 위해서 쿠키와 세션을 사용하게 됩니다. 1. Connectionless - 클라이언트가 요청을 보내고 응답을 받으면 그 연결을 끊어 버리는 특징 - 즉, http는 클라이언트가 request를 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는다. 2. Stateless - 통신이 끝나면 상태를 유지하지 않는 특징 - 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다. 쿠키와 세션은 위의 두 가지 특징을 해결하기 위해 사용한다. 예를들어, 쿠키과 세션을 사용하..

서버리스 아키텍처 적용기 - 서버리스란 무엇일까 ?

서버리스를 도입하게 된 계기는 서비스에 직접적으로 영향이 가는 API에서 광고 도메인을 분리하기로 결정이 되었고, 분리를 위한 아키텍처 구조는 서버리스를 사용하여 별도 자원 추가 없이 생성하기로 하였다. 최종적으로 사용한 아키텍처 구조는 Serverless Framework + AWS Lambda + AWS Api-Gateway 언어는 Node.js로 구성하였다. 블로그 포스팅의 목적인 서버리스(Serverless) ? 기존의 방식은 서비스를 배포하려면 항시 서버가 필요했고, 서버에 대한 개선 및 유지보수에 대한 인프라적인 문제가 존재한다. 이러한 문제를 해결하기 위해 생성된 것이 서버리스(Serverless)이다. Serverless 라는 단어만 보면 서버가 없는건가 ? 라는 의문이 든다. 하지만 서버..

객체 지향 설계와 스프링

자바 진영의 추운 겨울과 스프링의 탄생 🔥 EJB 🔥 자바 진영에서 표준으로 인정된 기술 Entity bean이라는 ORM 기술도 가지고 있었다. 기술 수준이 약했다..! 가격이 비쌌다 ..! 🔥 EJB 지옥 🔥 개발자들이 사용하기 너무 복잡하고 힘들었다. EJB 인터페이스에 의존적으로 코드를 짜야됬다. EJB를 비판하며 만든 오픈소스가 스프링 EJB의 Entity bean을 비판하며 만든 오픈 소스가 하이버네이트 하이버네이트를 통해 자바 표준인 JPA를 만들어 낸다. JPA (표준 인터페이스) [JPA 구현체들] 하이버네이트 / EclipsLink / 기타 등등 ... 스프링의 역사 ... 로드 존슨이 책 출간 EJB의 문제점 지적 책 출간 후 유겐휠러 및 얀 카로프가 로드 존슨에게 오픈 소스 프로젝트..

ObjectMapper & ModelMapper

토이프로젝트를 진행하면서, entity 객체에 대하여 dto로 변환하는 로직이 코드량의 많은 부분을 차지하고 있었다. 특히 계층 구조가 깊은 객체일수록 dto로 변환하는 로직은 더 복잡해지고 방대해졌다. 해당 문제를 해결하기 위해 라이브러리를 사용하기로 하였고, 라이브러리를 찾아보던 중, 두가지 mapper가 존재하였다. ✅ ObjectMapper ObjectMapper에 대해 알아보기 전, 직렬화 및 역직렬화에 대한 개념을 알고 있어야 한다. ✔️ 직렬화 객체 형식의 Object를 Json 형태로 변환해주는 것을 의미 직렬화를 위해서는 각 인스턴스 변수에 Getter 메소드가 포함되어 있어야 한다 OR @JsonProperty가 명시되어 있어야 한다. ✔️ 역직렬화 Json 형식의 포맷을 Object ..

AWS Simple Queue Service (SQS)

✅ Amazon SQS 기본 아키텍처 분산 대기열 Amazon SQS는 메시지를 SQS 서버에 중복 저장합니다. 메시지 수명 주기 생산자는 메시지 A를 대기열로 전송하고, 이 메시지는 Amazon SQS 서버에 중복 분산됩니다. 소비자는 메시지를 처리할 준비가 되면 대기열에서 메시지를 소비하고 메시지 A가 반환됩니다. 메시지 A는 처리되는 동안 대기열에 남아있고, 표시 제한 시간이 지속되는 동안 후속 수신 요청으로 반환되지 않습니다. 소비자는 대기열에서 메시지 A를 삭제함으로써, 표시 제한 시간이 만료되면 이 메시지가 수신되어 다시 처리하지 못하도록 설정합니다. ✅ Amazon SQS 사용 시 이점 보안 대기열에 메시지를 보내고 받을 수 있는 사용자를 제한할 수 있습니다. 이는, 기본 SQS 관리형 서버..

🔥 JUnit 정복해보기 - 1

✅ JUnit 5 소개 자바 8 이상을 필요로 한다. Platform 테스트를 실행해주는 런처 제공 IDE에서도 platform 을 제공한다. Jupiter TestEngine API 구현체로 JUnit 5를 제공 Vintage JUnit 4와 3을 지원하는 TestEngine 구현체 ✅ JUnit 5 시작하기 기본 어노테이선에 대해 알아보자 @Test spring-boot-starter가 제공하는 기본 junit 의존성이 5.xx 대로 변경되어 별다른 의존성 없이 jnit5 바로 사용 가능 단위 테스트를 하고 싶은 메소드에 해당 어노테이션을 달아주면 테스트 가능 @BeforeAll / @AfterAll 모든 테스트 들이 시작 하기 전 / 종료 한 후 딱 한번 실행되는 메소드 @BeforeEach / @..

Unit Test 작성의 필요성

단위 테스트 vs 통합 테스트 🏷 단위 테스트 (Unit Test) Unit Test는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. 여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메소드로 이해할 수 있다. 예를 들어, 웹 애플리케이션에서 로그인 메소드에 대한 독립적인 테스트가 1개의 단위테스트가 될 수 있다. 즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트 하는 것으로, '어떤 기능이 실행되면 어떤 결과가 나온다' 정도로 테스트를 진행한다. 🏷 통합 테스트 (Integration Test) Integration Test는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다. 일반적으로 애플리..

JPA | @Transactional 과 변경감지

DB 테이블에 저장되어 있는 데이터의 정보를 수정하기 위해 update 하는 로직을 개발하고자 한다면 다음과 같은 논리적 절차를 거치게 될 것이다. 트랜잭션 시작 변경하고자 하는 데이터의 id를 통한 조회 조회한 데이터에 수정할 내용들로 교체 update 처리 트랜잭션 커밋 JPA에서는 위의 데이터 변경 로직을 어떻게 처리해주는지 확인해보자 트랜잭션의 시작 영속성 Entity 조회 - 없으면 DB 조회 후 영속화 조회한 영속성 Entity의 데이터 수정 트랜잭션 커밋 위의 과정에서 볼 수 있듯이 JPA에서는 따로 update 쿼리를 요청하는 부분이 없습니다. 여기서 JPA의 장점 중 하나가 나오는데 바로 변경감지(Dirty Checking) 입니다. ✅ 변경감지 변경감지는 트랜잭션 커밋 시, 영속화된 E..

JPA | 일대일 양방향 관계에서 CasCade 옵션 적용 일화 ..?🤔

만약에 Parent - Child 는 양방향 연관관계로 되어 있고,. Child 테이블이 외래키를 관리하는 주 테이블이라고 하자. 여기서 이 두개의 인스턴스를 모두 영속화 하기 위해서는 em.persist()를 최소 2번은 호출하여야 각각 모두 영속화가 된다. 여기서 드는 의문점은 다음과 같다. Parent가 관리하는 Child 인스턴스의 경우 Parent를 em.persist() 할 때 같이 진행하면 편하지 않을까? 이러한 질문을 해결할 수 있는 옵션이 바로 cascade 영속성 전이 이다. ✅ cascade의 종류 All Persist Remove Merge Refresh Detach 주로 사용하게 되는 것은 All 또는 Persist 이다. 위의 종류에 대한 자세한 설명은 후속편으로 깊이 있기 공부..

JPA | QueryDsl orderBy(정렬) 동적으로 사용하는 방법

리뷰 리스트를 조회하는 API 내에서, - 최근 등록 순 - 별점 높은 순 - 별점 낮은 순 으로 데이터를 정렬했어야 했다. 정적으로 고정된 정렬이 아닌, 파라미터 값에 따라 동적으로 정렬이 되어야 했다. queryDsl 에서 동적 정렬을 위한 OrderSpecifier 클래스를 사용해보려고 한다! 일단 해당 클래스의 필드들을 살펴보면 아래와 같다. 클래스의 멤버들을 살펴 보면 해당 클래스의 생성자를 사용하여 생성할 수 있는데, 파라미터 변수들로는 Order enum, target 객체, NullHandling enum이 존재한다. - order Enum은 아래와 같이 구성되며, 상황에 맞게 내림차순, 오름차순을 적용해주면 될 것 같다. public enum Order { /** * Ascending o..