Archive: 2022

널 오브젝트 패턴

1234Employee e = DB.getEmployee("Yang");if (e != null && e.isTimeToPay(today)) { e.pay();} 이런 식의 코드가 있다고 하자. 데이터베이스에서 조회하는 직원이 존재하지 않으면 null을 반환할 수 있기 때문에 조건문에서 먼저 null

퍼사드와 미디에이터 패턴

퍼사드 패턴퍼사드는 외관, 건물의 정면을 의미한다.퍼사드 패턴은 복잡하고 일반적인 인터페이스를 가진 객체 그룹을 간단하고 구체적인 인터페이스를 제공한다. DB를 활용하기 위해 java.sql 패키지의 복잡한 인터페이스를 가진 객체들을 상위 모듈에서 사용하기는 어렵다.이를 위해 퍼사드 역할을 하는 객체를 만들 수 있다. Application 입장에는 java

의존성 분리를 통해 설계 개선하기 2편 (우아한객체지향)

도메인 컨셉 문제점사용자가 가게에서 메뉴 A를 골라서 장바구니에 저장해놓은 상태에서 가게 주인이 메뉴 A의 세부 내용을 바꾸면 사용자 장바구니에 있는 메뉴 A와 가게에서 판매 중인 메뉴 A의 불일치가 생긴다.그래서 이제 주문할 때마다 사용자가 주문하려는 메뉴 A가 실제 가게에서 판매 중인 메뉴 A와 일치하는 지 검증하려고 한다. 주문 검증 메뉴 이름 &#x

의존성 분리를 통해 설계 개선하기 1편 (우아한객체지향)

의존성두 클래스 A, B가 있을 때 어느 한 쪽이 변화가 생길 때 다른 한 쪽도 함께 변경될 가능성이 있는 경우를 의존성이 있다고 말한다. 여기서 변경이란클래스의 이름 변경, 메서드의 이름 변경, 메서드의 구현 변경 등을 의미한다. 의존에는 클래스 간 의존성과 패키지 간 의존성이 존재한다. 클래스 의존성의 종류연관 관계 Association 123cla

커맨드와 액티브 오브젝트 패턴

커맨드 패턴123public interface Command { void do();} 여러 행동을 호출해야 하는 경우 여러 행동을 커맨드로 추상화하여 사용하는 쪽에서는 커맨드가 어떻게 행동하는 지 관심없이 사용하기만 하도록 구현하는 패턴이다.이 패턴은 커맨드를 사용하는 쪽에서 커맨드를 실행하기 위해서 어떤 객체가 사용되는지 알아지

Elastic Beanstalk와 Github Actions를 활용해서 CICD 무중단 배포 구현하기

Elastic Beanstalk란AWS에서는 인프라에 대한 지식이 없어도 배포 환경을 구축할 수 있는 Elastic Beanstalk(EB)를 제공한다. EB에 어플리케이션을 전달하면 EB에서 용량 프로비저닝, 로드 밸런싱, 조정, 어플리케이션 상태 모니터링을 자동으로 처리한다. 다음은 EB가 어떻게 어플리케이션을 관리하는 지 보여주는 워크플로우다. Ela

AWS의 Blue-Green 배포 구현 방법 알아보기

문제 배경우아한테크코스에서 프로젝트를 진행할 때는 우아한테크코스에 AWS 계정을 제공해줘서 EC2를 비용 걱정없이 갯수 상관없이 사용할 수 있었다. 하지만 우아한테크코스를 수료하고 나서는 AWS 계정 제공이 되지 않아서 팀원들이 자체 AWS 계정을 만들어서 인프라를 구축해야 했다. 이때 AWS에서는 프리티어로 RDS 인스턴스 한 개와 EC2 인스턴스 한 개

Java11의 HttpClient로 서버에서 다른 API로 요청 보내기

도입 배경Github Oauth를 통해 인증인가를 구현하던 과정에서 깃허브에서 발급된 코드를 통해 Github API에 Github Access Token을 발급 요청을 보내야했다. 그리고 발급된 Github Access Token을 통해 해당 사용자의 정보를 요청해야 했다. 선택 가능한 방법들서버에서 HTTP 요청을 보낼 수 있는 방법은 여러가지가 있다.

RestDocs의 Custom Snippet으로 에러코드 쉽게 문서화하기

배경RestDocs로 테스트를 통과한 API에 대해서 문서화를 할 수 있다.우리 프로젝트에서는 정상 요청 흐름을 중점으로 API 문서화했다.하지만 해당 API에서 발생 가능한 애외 상황에 대한 응답도 정리해줘야 했다.그래서 우리는 백엔드 단에서 발생하는 예외에 매핑되는 예외 코드를 만들어서 예외 상황 발생 시 해당 예외 코드를 바디에 담아서 반환하도록 해서

인증 인가에 사용되는 토큰을 어디에서 관리할까? (이론 편)

이번 포스트에서는 우아한테크코스 팀 프로젝트에서 리프레시 토큰을 적용하게 된 계기를 정리해본다. 배경우아한기크코스 팀 프로젝트 회의 중 현재 우리가 사용하고 있는 인증 인가 방식을 현업에서도 유효한가에 대해 의논한 적이 있다.당시 팀 프로젝트의 인증 인가는 JWT 액세스 토큰을 세션 스토리지에 저장해놓는 방식으로 운영하고 있었다. 문제 상황이 방식에는 크게

Spring boot에서 JWT 토큰 발급 구현하기

도입 배경우아한테크코스에 프로젝트를 진행하는데 사용자의 정보를 기억해야 하는 상황이 필요한 경우가 있다. 예를 들면 사용자가 작성한 리뷰를 삭제하거나 수정할 수 있어야 한다. 그러려면 현재 접속한 사용자가 이전에 리뷰를 작성한 사용자임을 알아낼 수 있어야 한다. 일단 사용자를 구분하기 위해서 로그인을 해서 사용자를 구분해서 관리할 수 있도록 했다. 이때 사

JPA를 왜 쓰나요?

요약 JPA는 객체지향 언어인 자바와 데이터베이스의 구조가 달라서 생기는 문제를 개발자가 더 쉽게 해결할 수 있도록 돕는다.객체지향은 행동과 책임 중심으로 설계되고, 데이터베이스는 데이터 중심으로 설계된다.객체지향은 참조의 방향이 정해져있지만, 데이터베이스는 하나의 외래키로 양쪽 모두 참조 가능하다.동일성 비교를 객체는 인스턴스의 주소값으로 하고 데이터

Transactional 어노테이션

요약 트랜잭션이 무엇인지 알아본다.@Transactional의 Propagation 옵션을 알아본다.@Transactional의 롤백 기준을 알아본다.@Transactional 적용 실패하는 경우를 알아본다. 트랜잭션?모두 반드시 성공해야 하는 연속된 작업들을 트랜잭션이라 한다.만약 작업들 중 하나만 실패해도 모든 작업들이 어플리케이션의 상태를 변경시키

Bean Validation으로 검증하기

Bean Validation일반적인 유효성 검사 로직지켜져야 할 조건에 맞지 않은 상황에 로직을 진행하려는 경우 예외를 터트려서 의도하지 않은 진행을 막을 수 있다. 1234567891011public class Name { private final String name; public Name(String name) {

Spring IoC 컨테이너, 컴포넌트 스캔, 빈 생명주기

요약 (다음 질문의 정답을 안다면 이 포스트를 읽지 않아도 된다.) IoC 컨테이너와 ApplicationContext는 완전히 같은 개념인가? IoC 컨테이너를 구성하는 방법은 어떤 것이 있는가? BeanFactory와 ApplicationContext의 차이를 알고 있는가? IoC 컨테이너스프링의 IoC 컨테이너는 객체를 인스턴스화하고 구성 및

왜 스프링을 쓰는 걸까??(IoC, DI)

요약 의존 역전과 유연함을 위해서 DI하도록 객체를 설계하는 경우,매번 해당 객체를 사용할 때마다 필요한 객체를 찾아서 주입해줘야 한다.스프링 프레임워크는 DI를 대신해주는 역할을 한다. 유연한 설계를 위해서객체지향 설계 원칙 중 SOLID 원칙이 있다.그 중 D에 해당하는 의존 역전 원칙은 상위 모듈이 하위 모듈의 구현에 의존하지 말고, 상위 모듈이