6-영속성 어댑터 구현하기

의존성 역전 영속성 어댑터의 책임 영속성 어댑터가 하는 일 입력을 받는다. 입력을 데이터베이스 포맷으로 매핑한다. 입력을 데이터베이스로 보낸다. 데이터베이스 출력을 애플리케이션 포맷으로 매핑한다. 출력을 반환한다. JPA를 사용하는 경우에는 입력 모델을 JPA 엔티티 객체로 매핑할 것이다. 맥락에 따라서 입력 모델을 JPA 엔티티로 매핑하는 것이 들이는 노력에 비해 얻는 것이 많지 않은 일이될 수 있으므로 매핑하지 않는 전략도 존재한다. 영속성 어댑터의 입력 모델은 애플리케이션 코어에 있기 때문에 영속성 어댑터 내부를 변경하는 것이 코어에 영향을 미치지 않는다....

2024-12-05 · 2 min · 371 words

5-웹 어댑터 구현하기

의존성 역전 인커밍 어댑터는 애플리케이션 서비스에 의해 구현된 인터페이스인 전용 포트를 통해 애플케이션 계층과 통신한다. 어댑터와 유스케이스 사이에 간접 계층을 넣어야 되는 이유 포트: 애플리케이션 코어와 외부 세계와 통신할 수 있는 곳에 대한 명세이다. 포트를 적절한 곳에 위치시키면 외부와 어떤 통신이 일어나고 있는지 정확히 알 수 있다. 웹 소켓의 경우 웹 어댑터에서 아웃고잉 포트를 구현하고 애플리케이션 코어에서 호출해야 한다. 웹 어댑터의 책임 웹 어댑터가 일반적으로 하는 일 HTTP 요청을 자바 객체로 매핑 권한 검색 입력 유효성 검증 입력을 유스케이스의 입력 모델로 매핑 유스케이스 호출 유스케이스의 출력을 HTTP로 매핑 HTTP 응답을 반환 유스 케이스 입력 모델의 검증과 차이점 웹 어댑터 입력 모델과 유스 케이스 입력 모델에는 차이가 있을 수 있으므로 또 다른 검증을 수행해야 한다....

2024-12-05 · 2 min · 253 words

6-다양한 연관관계 매핑

엔티티 연관관계를 매핑할 때는 3가지를 고려해야 한다. 다중성 다대일 일대다 일대일 다대다 단방향, 양방향 객체 관계에서 한 쪽만 참조하는 것을 단방향 관계, 양쪽이 서로 참조한느 것을 양방향 관계라 한다. 연관관계의 주인 두 객체의 연관관계 중에서 외래 키를 관리하는 객체를 연관관계의 주인이라 한다. 외래 키를 가진 테이블과 매핑한 엔티티가 외래 키를 관리하는 게 효율적이므로 보통 이곳을 연관관계의 주인으로 선택한다. 다대일 일대다 또는 다대일 관계에서 외래 키는 항상 다쪽에 있다. 따라서 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다....

2024-12-01 · 7 min · 1364 words

15-데이터 타입

컬럼의 데이터 타입과 길이를 선정할 때 가장 주의할 사항은 다음과 같다. 저장되는 값의 성격에 맞는 최적의 타입을 선정 가변 길이 컬럼은 최적의 길이를 지정 조인 조건으로 사용되는 컬럼은 똑같은 데이터 타입으로 선정 문자열(CHAR와 VARCHAR) 저장 공간 CHAR와 VARCHAR의 공통점은 문자열을 저장할 수 있는 데이터 타입이라는 점이고, 가장 큰 차이는 고정 길이냐 가변 길이냐다. CHAR(1)과 VARCHAR(1) 타입을 사용할 때 사용되는 저장 공간의 크기 두 문자열 타입 모두 한 글자를 저장할 때 사용하는 문자 집합에 따라 실제 저장 공간은 1~4바이트까지 사용된다....

2024-11-18 · 13 min · 2760 words

5-연관관계 매핑 기초

방향 단방향: 객체의 한 쪽만 참조하는 것 양방향: 객체가 서로 참조하는 것 다중성: N:1, 1:N, 1:1, N:M 연관관계 주인: 객체를 양방향 영관관계로 만들면 연관관계의 주인을 정해야 한다. 단방향 연관관계 객체는 참조(주소)로 연관관계를 맺는다. 테이블은 외래 키로 연관관계를 맺는다. 참조를 사용하는 객체의 연관관계는 단방향이다. A -> B (a.b) 외래 키를 사용하는 테이블의 연관관계는 양방향이다. A JOIN B가 가능하면 반대로 B JOIN A 도 가능하다. 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다....

2024-11-12 · 2 min · 421 words

RabbitMQ 튜토리얼

용어 정리 produce: 메시지를 보내는 행위. 메시지를 보내는 프로그램을 producer라고 한다. consume: 메시지를 받는 행위. 메시지를 받는 프로그램을 consumer라고 한다. queue: 큰 메시지 버퍼. 호스트의 메모리 및 디스크에 의해 제한될 수 있다. 많은 프로듀서가 하나의 큐에 메시지를 보낼 수도 있고, 많은 컨슈머가 하나의 큐에서 받을 수도 있다. 하나의 프로그램이 프로듀서이자 컨슈머 일 수도 있다. Java Client 사용해보기 종속성 추가 <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.16.0</version> </dependency> Producer Connection: 소켓 커넥션의 추상화 Connection과 Channel은 Autoclosable의 구현체 channel....

2024-11-11 · 8 min · 1615 words

3-코드 구성하기

계층으로 구성하기 buckapl |--- domain | |----- Account | |----- Activity | |----- AccountRepository | |----- AccountService |--- persistence | |----- AccountRepositoryImpl |--- web | |----- AccountController domain 패키지에 AccountRepository 인터페이스를 추가하고, persistence 패키지에 AccountRepositoryImpl 구현체를 둠으로써 의존성을 역전시켰다. 위 패키지 구조가 최적이 아닌 이유 애플리케이션의 기능 조각이나 특성을 구분 짓는 패키지 경계가 없다. 애플리케이션이 어떤 유스케이스들을 제공하는지 파악할 수 없다. 패키지 구조를 통해서는 우리가 목표로하는 육각형 아키텍처를 파악하기 어렵다. 기능으로 구성하기 buckpal |-- account |-- Account |-- AccountController |-- AccountRepository |-- AccountRepositoryImpl |-- SendMoneyService 패키지 경계를 package-private 접근 수준과 결합하면 각 기능 사이의 불필요한 의존성을 방지할 수 있다....

2024-11-11 · 2 min · 384 words

JsonPath 문법

배경 통합 테스트에서 WebTestClient를 사용하고 있는데 응답 바디 assertion에서 내부적으로 JsonPath 방식으로 응답 바디의 경로를 지정해 검증하고 있다. 좀 더 유연한 테스트 코드 작성을 위해 JsonPath 표현식 작성법을 이해한다. 표기법 JsonPath 표현식에는 2가지의 표기법이 존재한다. 점 표기법: $.players[0].nickname 괄호 표기법: $['players'][0]['nickname'] 연산자 연산자 설명 $ 루트 노드 @ 처리하고 있는 현재 노드 * 와일드카드. 숫자나 이름이 필요한 모든 곳에서 사용 가능하다. .. Deep scan. 이름이 필요한 모든 곳에서 사용 가능하다. ....

2024-11-06 · 2 min · 385 words

3-영속성 관리

앤티티 매니저(Entity Manager)는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련된 모든 일을 처리한다. 개발자 입장에서 엔티티 매니저는 엔티티를 저장하는 가상의 데이터베이스로 생각하면 된다. 엔티티 매니저 팩토리와 엔티티 매니저 데이터베이스 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다. 엔티티 매니저 팩토리는 엔티티 매니저를 만드는 공장인데 ,공장을 만드는 비용은 상당히 크다. 따라서 한 개만 만들어서 애플리케이션 전체에서 공유하도록 설계되어 있다. 엔티티 매니저 팩토리는 여러 스레드가 동시에 접근해도 안전하므로 서로 다른 스레드 간에 공유해도 되지만, 엔티티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안 된다....

2024-11-06 · 6 min · 1137 words

2-의존성 역전하기

단일 책임 원칙 오해의 소지가 있는 해석: 하나의 컴포넌트는 오로지 한 가지 일만 해야 하고, 그것을 올바르게 수행해야 한다. 올바른 해석: 컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다. 변경할 이유라는 것은 컴포넌트 간의 의존성을 통해 쉽게 전파된다. 어떤 컴포넌트의 의존성 각각은 이 컴포넌트를 변경하는 이유 하나씩에 해당한다. 단일 책임 원칙을 위반하면 시간이 갈수록 변경하기 어려워지고 그로 인해 변경 비용도 증가한다. 부수효과에 관한 이야기 잘못 구조화된 소프트웨어를 변경하는 데는 부수 효과로 인해 더 많은 비용을 지불하도록 만드는 경우가 많다....

2024-11-06 · 2 min · 413 words

2-JPA 시작

객체 매핑 시작 CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, NAME VARCHAR(255), AGE INTEGER, PRIMARY KEY(ID) ) @Entity @Table(name = "MEMBER") class Member( @Id @Column(name = "ID") var id: String, @Column(name = "NAME") var username: String, var age: Int, ) @Entity: 이 클래스를 테이블과 매핑된다고 JPA에게 알려준다. @Table: 엔티티 클래스에 매핑할 테이블 정보를 알려준다. name 속성을 사용해 Member엔티티를 MEMBER 테이블에 매핑했다. @Id: 엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다. @Column: 필드를 컬럼에 매핑한다....

2024-10-24 · 3 min · 573 words

1-JPA 소개

SQL을 직접 다룰 때 발생하는 문제점 반복, 반복 그리고 반복 객체를 데이터베이스에 CRUD하려면 너무 많은 SQL과 JDBC API를 코드로 작성해야 한다. SQL 작성 JDBC API를 사용해서 SQL 실행 SQL과 객체의 매핑 테이블마다 이런 일을 반복해야 해서 작성해야 된다. SQL에 의존적인 개발 Member 객체에 새로운 필드 Team을 추가할 경우 클래스에 필드 추가 CRUD 쿼리 수정 연관 관계 매핑을 위한 JOIN 쿼리가 있는 새로운 DAO 메소드 추가 Member 객체는 team 필드가 있는지 확인하기 위해 DAO를 열어서 SQL을 확인할 수 밖에 없다....

2024-10-24 · 5 min · 907 words

1-계층형 아키텍처의 문제는 무엇일까?

계층형 아키텍처는 코드에 나쁜 습관들이 스며들기 쉽게 만들고 시간이 지날수록 소프트웨어를 점점 더 변경하기 어렵게 만드는 수많은 허점들을 노출한다. 계층형 아키텍처는 데이터베이스 주도 설계를 유도한다 웹 계층은 도메인 계층에 의존하고, 도메인 계층은 영속성 계층에 의존하기 때문에 자연스레 데이터베이스에 의존하게 된다. 애플리케이션을 개발할 때 상태가 아니라 행동을 중심으로 모델링 해야한다. 행동이 상태를 바꾸는 주체이기 때문에 행동이 비즈니스를 이끌어간다. 하지만 전통적인 계층형 아키텍처에서는 데이터베이스의 구조를 먼저 생각하고, 이를 토대로 도메인 로직을 구현하게 된다....

2024-10-23 · 3 min · 440 words

GSLB 이해하기

목표 GSLB가 무엇인지 이해한다. GSLB란? Global Server Load Balancing 전 세계에 걸쳐 분산되어 있는 서버들을 대상으로 로드밸런싱하는 기법 GSLB는 분산되어 있는 서버를 아래와 같은 기준으로 선택해 로드밸런싱 한다. 네트워크 지연 시간 지리적 근접성 서버 가용성 네트워크 상태 서버 부하 etc CDN도 GSLB 기술을 사용한 것이라고 볼 수 있다. GSLB로 얻을 수 있는 이점 네트워크 지연 시간 감소: 지역적으로 가까운 서버를 선택하여 지연 시간을 줄일 수 있다. 안정성 및 가용성 증가: 로드 밸런서가 서버들의 상태를 모니터링하고 있어, 일부 서버가 중단되 었으면 다른 서버로 우회가 된다....

2024-10-21 · 1 min · 163 words

Spring Framework에서 존재하지 않는 URL로 요청 시 처리 과정

목표 Spring Boot에서 존재하지 않는 URL로 요청 시 404 응답한다. 어떤 내부 동작으로 404 응답을 하게 되는지 이해한다. ResourceHttpRequestHandler Spring Boot 기본 설정 기준으로 모든 요청에 대해서, 처리할 다른 핸들러가 없으면 ResourceHttpRequestHandler로 정적 리소스를 찾아서 반환하려고 시도한다. 해당 핸들러는 spring.web.resources.add-mappings를 false로 설정하는 등의 방법으로 사용하지 않게 설정하여, 정적 리소스를 응답하지 않도록 설정할 수 있다. 해당 핸들러 사용 유무에 따라 404 응답을 처리하는 위치가 달라진다. ResourceHttpRequestHandler를 사용하는 경우 처리 과정 Spring Framework 6....

2024-10-16 · 1 min · 190 words

Sealed 클래스의 서브 클래스 모두 가져오기

sealedSubclasses KClass의 프로퍼티로 sealedSubclasses라는 프로퍼티가 존재한다. 현재 호출하는 클래스가 Sealed 클래스이면 이를 상속한 하위 클래스들이 반환되고, 아니면 빈 리스트가 반환된다. 예시 sealed class Animal class Dog : Animal() class Cat: Animal() class Duck: Animal() class Tests { @Test fun test() { println(Animal::class.sealedSubclasses) } } 아래와 같은 결과를 확인할 수 있다. [class com.tests.Cat, class com.tests.Dog, class com.tests.Duck] 참고 자료 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-class/sealed-subclasses.html https://www.baeldung.com/kotlin/subclasses-of-sealed-class

2024-10-02 · 1 min · 60 words

KClass로 object 클래스의 인스턴스 가져오기

objectInstnace KClass의 인스턴수 중에 objectInstance가 존재한다. 현재 클래스가 object 클래스이면 해당 인스턴스가 반환되고, 아니면 null이 반환된다. 예시 object ObjectClass class SomeClass class Tests { @Test fun test() { assertThat(ObjectClass::class.objectInstance).isEqualTo(ObjectClass) assertThat(SomeClass::class.objectInstance).isNull() } } 참고 자료 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-class/object-instance.html

2024-10-02 · 1 min · 35 words

DecimalFormat

목표 DecimalFormat 클래스의 기본 사용법을 이해한다. DecimalFormat String 타입으로 십진수를 표현할 때 사용할 수 있다. 아래 예시는 double d= 1234567.89 으로 설명한다. 0: 숫자가 존재하면 그 숫자를 출력하고, 없으면 0을 출력한다. #: 숫자가 존재하면 그 숫자를 출력하고, 없으면 출력하지 않는다. .: 소수점 구분 기호를 넣을 위치를 표시한다. 만약 소수 부분에서 더 이상 표현할 수 없다면 반올림 된다. ,: 그루핑 구분자가 들어갈 위치를 표시한다. 참고 자료 https://www.baeldung.com/java-decimalformat

2024-10-02 · 1 min · 66 words

Java에서 DNS 캐시 TTL 설정

배경 DNS LookUp을 통해 도메인에 대한 IP 정보를 조회한다. JVM에서는 이런 IP 정보를 캐싱해서 매번 DNS LookUp을 하지 않는다. TTL을 설정하면 캐시가 남아 있는 주기를 설정할 수 있다. security 파일 수정으로 TTL 변경하기 Java 8 기준 $JAVA_HOME/jre/lib/security/java.security, Java 11 이상 기준 $JAVA_HOME/conf/security/java.security 파일에 있는 networkaddress.cache.ttl 프로퍼티 값을 설정하면 변경할 수 있다. 아래 예시는 TTL을 5초로 수정하는 예시다. # # This is the "master security properties file". # # An alternate java....

2024-10-01 · 1 min · 134 words

Argo CD 알아보기

목표 Argo CD의 용도가 무엇인지 이해한다. Argo CD 사용을 시작하는 방법을 이해한다. Argo CD란 쿠버네티스를 위해 사용되는 GitOps 패턴의 CD(Continuous Delivery) 도구이다. GitOps: git 레포지토리를 사용하여 인프라 프로비저닝 프로세스를 자동화하는 DevOps 기법이다. 쿠버네티스 매니페스트을 git 레포지토리에 명시하면, Argo CD는 지정된 환경에 애플리케이션 상태를 모니터링하고 원하는 상태가 되도록 배포를 자동화한다. Argo CD 구조 3가지 컴포넌트로 나뉜다. API Server: 웹 UI, CLI 및 CI/CD 시스템에 소비하는 API를 노출하는 gRPC/REST 서버이다. Repository Server: 애플리케이션 매니페스트를 보관하는 git 레포지토리의 로컬 캐시를 유지하는 내부 서비스다....

2024-09-16 · 2 min · 390 words