👩🏻‍💻 Programming 88

블루그린배포와 서버 부하분산을 위한 네트워크

스케일업 - 스케일아웃 = 블루그린배포 스케일업은 단일 서버(하드웨어) 장비의 성능을 증가시키는 것이다. 스케일아웃은 동일한 사양의 새로운 서버(하드웨어) 장비를 추가하는 것이다. 요약하면 스케일업은 Quality를, 스케일아웃은 Quantity를 증가시키는 것이다. 블루그린 배포는 기존에 운영중인 소스와, 향후 업데이트될 버젼의 소스를 나누는 방식이다. 예를 들어 로드 밸런서를 활용해 2개의 버젼(구버젼, 신버젼)을 배포한다. 신버젼을 테스트 한 뒤, 문제가 없다고 판단될 경우 구 버젼의 트래픽을 신버젼으로 보내면 된다. 서버 부하 분산을 위한 네트워크 서버 부하가 발생할 경우, 분산을 진행하기 위해 네트워크에 대해 잘 알고 있어야 한다. * 서버 : 무언가 제공하는 대상 * 부하 : load (= 짐..

Authorization 매커니즘

AOP : Aespect Oritented Programming 스프링 전반을 아우르는 여러 철학이 있는데, 가장 중요한 철학은 DI(의존성 주입)이다. 개발자가 직접 코딩하지 말고 컨테이너에게 맡기라는 말이다. DI를 통해 약한 상관성(Loosely coupled)을 설계할 수 있고 모듈화를 완성할 수 있다. DI와 함께 매우 중요한 철학이 관심사의 분리인데, 코드를 스파게티로 엮지 말고 관심이 있는 코드들을 따로 관리하라는 것이다. 관심사 분리가 가능한 이유는 AOP 기술 덕분이며, AOP는 아래와 같은 개념들로 구성된다. Aspect : 공통의 관심사 권한 처리 로그 트렌젝션 관리 세션관리 기타... Weaving 빈과 빈을 Proxy 로 감싸서 연결해주는 작업 빈과 빈의 호출사이에 PointCut..

Authentication 메커니즘

인증 vs 인가 인증 (Authentication) : 특정 리소스에 접근하려고 하는 사용자가 누구인지를 확인하는 절차다. 보통 사용자가 이름과 비밀번호을 입력하는 것으로 사용자를 인증한다. (로그인) 한 번 인증하고 나면 사용자를 식별하고 권한을 부여할 수 있다. (세션) 인가 (Authorization) : 인증된 사용자가 어떠한 자원(URI)에 접근 할 '권한'이 있는지 판별한다. 인증 (Authentication) (1) Authneication은 인증된 결과만 저장하는 것이 아니고, 인증을 하기 위한 정보와 인증을 받기 위한 정보가 하나의 객체에 동시에 들어 있다. 왜냐하면, 인증을 제공해줄 제공자(AuthenticationProvider)가 어떤 인증에 대해서 허가를 내줄 것인지 판단하기 위해..

JPA 더티 체킹(Dirty Checking)

Dirty Checking이란? Transaction안에서 엔티티의 변경이 일어나면 변경된 내용을 자동으로 DB에 반영하는 JPA 특성이다. 좀더 디테일한 설명은 다음과 같다. JPA는 엔티티 매니저가 엔티티를 저장 / 조회 / 수정 / 삭제한다. 그런데 엔티티 매니저가 제공하는 메소드들을 보면 저장 (persist) / 조회(find) / 삭제 (delete)로 수정에 해당되는 메소드가 없다. 대신에 수정에 해당되는 더티 체킹 (Dirty Checking)을 지원한다. 더티 체킹은 Transaction 안에서 엔티티의 변경이 일어나면 변경으 자동으로 DB에 반영하는 JPA 특성이다. DB에 변경 데이터를 저장하는 시점은 (1) Transaction Commit 시점 (2) EntityManager Fl..

JPA N+1 이슈

JPA의 N+1 이슈란?  아래 코드를 보면 총 3번의 Select가 이루어지고있다.DB에 저장된 리뷰가 총 2개이고, 추가로 최초 조회의 1번이 더해져 3번이 이루어졌다.Hibernate: select review0_.id as id1_6_, review0_.created_at as created_2_6_, review0_.updated_at as updated_3_6_, review0_.book_id as book_id7_6_, review0_.content as content4_6_, review0_.score as score5_6_, review0_.title as title6_6_, rev..

Embedded 타입

Embedded 타입이란? 새로운 값의 타입을 직접 정의하는 것이다. 가게에서 파는 물건을 생각해보자. 공급가 + 부가세를 합쳐서 나온 전체가격이 판매가격이 된다. 복잡한 판매품의 경우 공급가, 부가세 외에 바른 부차적인 요소들을 합쳐야 전체 판매가격이 나오는 경우도 있다. 입베디드타입을 써서 이러한 복합 값들의 타입을 직접 유저가 정의하여 필드들을 묶어서 하나로 활용할 수 있다. 왜 쓰는걸까? 만약 쇼핑몰 유저의 집주소 정보를 하나하나 변수로 선언해서 저장한다고 가정하자. 유저와 관련된 클래스는 간략하게 user / userHistory / userEvent가 있는데, 우리는 아래와 같은 변수들을 모든 클래스에 복붙해줘야 할것이다. private String city; private String dis..

SpringBoot의 @Converter

Converter란? 영어로 직역하면 전환기가 된다. 변수의 타입을 변환하여 저장 / 출력할때 사용된다. 예를들어 java에서는 'boolean'으로 값을 저장하고 Database에서는 String타입의 'Y', 또는 'N'으로 저장하고 싶을때 @Converter 어노테이션을 사용하면된다. 예시코드 책의 상품코드는 Integer로 저장하되 (ex : 100, 200, 300), 그에따른 책의 판매상태는 String으로 저장한다. (ex : 100 = "판매종료") 1. converter 객체 생성 package com.fastcampus.jpa.bookmanager.domain.converter; import com.fastcampus.jpa.bookmanager.repository.dto.BookSta..

Native Query

Native Query란? Native Query를 의역하면 '순수 쿼리'가 된다. 말그대로 흔히 사용한 쿼리문을 순수하게 가져온 것이다. [사용방법] @Query(value = "select * from book", nativeQuery = true) List findAllCustom(); 사용법은 위 코드처럼 쿼리문을 value로 입력한 뒤, nativeQuery를 true로 선언하면 된다. 보다시피 쿼리문은 JPQL이 아닌 일반 쿼리문을 쌩으로 작성한 것과 동일하다. [JPQL 예시] @Query(value = "select new com.fastcampus.jpa.bookmanager.repository.dto.BookNameAndCategory(b.name, b.category) from Boo..

Soft delete와 Hard delete

둘의 차이는? 방식 설명 Soft Delete (논리삭제) 'UPDDATE table SET delete = 1 WHERE id = 2' 형태로 ROW가 삭제되지 않고 flag를 통한 제어 방식. 삭제여부를 알 수 있는 컬럼에 데이터가 삭제되었다는 값을 넣어서 표현한다. Hard delete (물리삭졔) 'DELETE FROM table WHERE id = 2' 형태로 ROW가 실제로 삭제되는 방식 현업에서는 Hard delete보다 Soft delete를 보다 자주 사용한다. 예시 id 회원 id 회원 이름 삭제 여부 1 1 김가나 0 2 1 김가나 1 3 1 김가나 0 Soft delete의 경우, UPDATE 명령어를 이용하여 삭제 여부의 컬럼 값을 true로 바꿔준다. 결론적으로 실제 서비스에서 ..

Cascade와 고아제거속성

Cascade란? 영속성의 전이를 제공해준다. (*영속 : 영원히 계속함) 먼저 Cascade에는 크게 6가지의 종류가 있다. ALL : 모두 적용 PERSIST : 영속 (저장) MERGE : 병합 REMOVE : 삭제 REFRESH : Refresh DETACH : DETACH 각 옵션에 따라 행동이 이루어지는데, 예를들어 PERSIST로 설정할 경우, 자식 엔티티까지 영속화해서 저장한다. 또다른 예로 REMOVE로 설정할 경우, 부모 엔티티만 삭제해도 자식 엔티티까지 함께 삭제된다. REFRESH의 경우 연결된 하위 엔티티까지 인스턴스의 값을 새로 고침하며, DETACH는 연결된 하위 엔티티까지 영속성을 제거한다. 예시 [BookRepositoryTest.java] @Transactional @Te..