JsonPath 문법

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

2024-11-06 · 2 min · 385 words

4-엔티티 매핑

@Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야한다. @Entity 적용 시 주의사항 기본 생성자가 필수다(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. 저장할 필드에 final을 사용하면 안 된다. kotlin을 사용할 때는 maven의 jpa 플러그인을 사용 한다면 파라미터가 없는 생성자를 만들 필요가 없다. (https://kotlinlang.org/docs/no-arg-plugin.html#jpa-support) kotlin을 사용할 때는 기본적으로 final 클래스로 만들어지는데, 아래와 같이 플러그인을 이용해서 특정 어노테이션이 붙어 있는 경우에는 open 클래스로 만들도록 수정할 수 있다....

2024-11-06 · 4 min · 838 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

3-애자일

애자일은 불확실성이 높은 일에 대해서 애초에 이것이 불가능하다고 본다. 애자일이 불확실성을 다루는 방식은 좀 더 짧은 주기로 더 일찍 피드백을 받는 것으로 정리할 수 있다. 학습과 협력은 불확실성이 큰 상황에서 좋은 대응전략이 된다. 애자일의 씨앗 고객에게 매일 가치를 전하라 매일: 불확실성이 높을수록 학습 빈도가 자주 있어야 한다. 고객에게: 이해당사자와 협력 할 떄 가치를 전하면 협력이 쉽다. 애자일 도입 성공 요인 분석 애자일의 성숙도가 높은데 성공도가 낮은 조직은 없었다. 애자일의 성숙도가 낮더라도 프로젝트 성공에 도움이 될 수 있다....

2024-09-15 · 2 min · 232 words

3-시스템 설계 면접 공략법

효과적 면접을 위한 4단계 접근법 1단계: 문제 이해 및 설계 범위 확정 성급하계 최종 설계를 내놓으면 잘못된 시스템을 설계할 가능성이 높아진다. 엔지니어가 가져야 할 가장 중요한 기술 중 하나는 올바를 질문을 하는 것, 적절한 가정을 하는 것, 그리고 시스템 구축에 필요한 정보를 모으는 것이다. 요구사항을 이해하는데 에는 아래와 같은 질문들을 생각해볼 수 있다. 구체적으로 어떤 기능들을 만들어야 하나? 제품 사용자 수는 얼마나 되나? 회사의 규모는 얼마나 빨리 커지리라 예상하나? 석 달, 여섯 달, 일년 뒤의 규모는 얼마나 되리라 예상하는가?...

2024-09-15 · 3 min · 427 words

3-설계 원칙

SOLID 원칙의 목적은 중간 수준의 소프트웨어 구조가 아래와 같도록 만드는 데 있다. 변경에 유연하다. 이해하기 쉽다. 많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트의 기반이 된다. SOLID 원칙 SRP(단일 책임 원칙): 하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 책임져야 한다. OCP(개방-폐쇄 원칙): 기존 코드를 수정하기보다는 반드시 새로운 코드를 추가하는 방식으로 시스템의 행위를 변경할 수 있도록 설계해야만 소프트웨어 시스템을 쉽게 변경할 수 있다. LSP(리스코프 치환 원칙): 상호 대체 가능한 구성요소를 이용해 소프트웨어 시스템을 만들 수 있으려면, 상위 타입 자리에 하위 타입으로 치환할 수 있어야된다....

2024-09-15 · 4 min · 824 words

3-물리 계층 데이터를 전기 신호로 변환하기

물리 계층의 역할과 랜 카드의 구조 피지컬 계층: 데이터를 전송하기 위해 시스템 간의 물리적인 연결을 하고 전기 신호의 변환 및 제어하는 역할을 담당한다. 1계층은 전기 신호를 0과 1의 비트열을 전기 신호, 전기 신호를 0과 1의 비트열로 변환하는 역할을 한다. 전기 신호에는 아날로그 신호와 디지털 신호가 있다. 아날로그 신호는 전화 회선이나 라디오 방송에서 사용되는 신호다. 컴퓨터는 네트워크를 통해 데이터를 송수신할 수 있도록 랜 카드가 메인 보드에 포함되어있다. 랜 카드가 데이터를 전기 신호로 변환해준다....

2024-09-15 · 3 min · 442 words

3-데이터로 작업하기

JDBC를 사용해서 데이터 읽고 쓰기 관계형 데이터를 사용할 경우 자바 개발자들이 가장 많이 사용하는 두 가지 방법은 JDBC와 JPA다. 스프링의 JDBC 지원은 JdbcTemplate 클래스에 기반을 둔다. JdbcTemplate은 JDBC를 사용할 때 요구되는 모든 형식적이고 상투적인 코드없이 개발자가 관계형 데이터베이스에 대한 SQL 연산을 수행할 수 있는 방법을 제공한다. connection 생성, statement 생성 connection, statement, result set 닫기 SQLException 예외 처리 SQLException은 checked 예외지만 대부분의 흔한 문제들은 catch 블록에서 해결될 수 없으므로 현재 메서드를 호출한 상위 코드로 처리를 넘겨야 한다....

2024-09-15 · 3 min · 473 words

3-데이터

이 장에서는 간접 쿼리 최적화를 다룬다. 세 가지 비밀 인덱스가 도움이 되지 않을 수 있다 인덱스는 성능에서 핵심이지만 좋은 인덱스라도 쿼리가 느릴 수 있다. 인덱스 없이는 성능을 달성할 수 없지만 무한한 데이터 크기에 대해 무한한 영향력을 제공한다는 의미는 아니다. 인덱스 스캔의 경우 테이블의 행 수가 증가할수록 인덱스 스캔을 사용하는 쿼리에 대한 응답 시간도 늘어나므로 반드시 지연 시간이 발생한다. 더 이상 최적화할 수 없으면 간접 쿼리 최적화를 한다. 행 찾기의 경우 아래 나열된 것 처럼 한 행만 일치하는 인덱스 조회 접근 유형이 아니라면, rows 필드에 주의를 기울여야 한다....

2024-09-15 · 7 min · 1454 words