post-thumbnail

YAML로 프로퍼티 작성

YAML YAML이라는 이름은 "YAML은 마크업 언어가 아니다 (YAML Ain't Markup Language)” 라는 재귀적인 이름에서 유래되었다. 원래 YAML의 뜻은 “또 다른 마크업 언어 (Yet Another Markup Language)”였으나, YAML의 핵심은 문서 마크업이 아닌 데이터 중심에 있다는 것을 보여주기 위해 이름을 바꾸었다. 오늘날 XML과 JSON이 데이터 직렬화에 주로 쓰이기 시작하면서, 많은 사람들이 YAML을 '가벼운 마크업 언어'로 사용하려 하고 있다. Spring에서 YAML 사용 기존 properties 파일 대신 yaml 파일 작성 Configuration 빈에서 @PropertySource 변경 properties → ya

3일 전
·
0개의 댓글
·
post-thumbnail

테스트 코드에서 @Transactional, @Rollback

다음 테스트 코드에서 @Transactional, @Rollback의 역할을 알아본다. testMember 테스트 메소드 내 memberRepository를 사용하기 위해서 @Transactional 어노테이션이 필요하다. 없으면 다음 에러가 뜬다. Transaction 메소드를 사용하기 위해 필요해 보인다. @Rollback 값은 기본적으로 true다. @Transactional을 통해 DB에 변경사항이 반영이 되지 않고 롤백 된다. 따라서 save를 통한 insert 쿼리를 확인할 수 없다. 이를 확인하기 위해 @Rollback 어노테이션 값을 false로 두어 공부할 때 확인한다. 롤백하지 않으면 위처럼 insert 쿼리를 확인할 수 있다.

2023년 8월 12일
·
1개의 댓글
·
post-thumbnail

Environment Profile

Environment ApplicationContext는 EnvironmentCapable 인터페이스를 상속해 environment를 제공한다. EnvirionmentCapable 인터페이스 내용은 다음과 같다. Environment는 애플리케이션의 개발 환경, 테스트 환경, 운영 환경 등을 의미한다. 개발 중에는 H2 DB를 사용하다가 운영 중에는 MySQL을 사용해 환경을 바꿀 수 있다. 스프링의 환경은 Profile과 Property로 제공한다. Profile에 따라 환경이 바뀌고 그에 따라 Property Source가 바뀐다. Properties DB 접속 정보, 서버 포트 정보 등 다양한 정보를 코드 상에 직접 작성하면 배포마다 바꿔야하거나 패스워드 같은 민감한 정

2023년 5월 16일
·
0개의 댓글
·

객체지향 생활 체조 원칙

소트웍스 앤솔러지 (저 소트웍스, 마틴 파울러 | 역 이창신 외 4명 | 위키북스 |2009) 의 6장 객체지향 생활 체조 부분에서, 실생활에서 좋은 객체지향 설계 습관을 기를 수 있는 훈련을 소개 한다. 평소 보다 훨씬 엄격한 코드 작성 표준을 제시함으로써 객체지향적인 사고 개발을 돕는다. 규칙 한 메서드에 오직 한 단계의 들여쓰기만 한다. else 예약어를 사용하지 않는다. 모든 원시값과 문자열을 포장(Wrap) 한다. 한 줄에 점(.)을 하나만 찍는다. 줄여쓰지 않는다 (축약금지). 모든 엔티티를 작게 유지한다. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. 1급(First-Class) 콜렉션을 사용한다. 게터(Getter) / 세터(Setter) / 프로퍼티(Property) 를 사용하지 않는다.

2023년 5월 11일
·
0개의 댓글
·

Lifes Cycle

Bean Lifecycle Callbacks Bean 생성 생명주기 콜백 @PostConstruce 애노테이션이 적용된 메소드 호출 Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출 @Bean 애노테이션이 initMethod에 설정한 메소드 호출 Bean 소멸 생명주기 콜백 @PreDestroy 애노테이션이 적용된 메소드 호출 Bean이 DisposableBean 인터페이스 구현시 destroy 호출 @Bean 애노테이션의 destroyMethod에 설정한 메소드 호출 다음과 같은 코드로 확인할 수 있다. 실행 결과 콜백 메소드 순서는 다음과 같다. 빈을 정의할 때 @Bean 어노테이션의 initMethod 속성을 이용해 초기화 메소드를 지정할 수 있다. 실행 결과는 다음과 같고 init 메소드가 나중에 실행된다.

2023년 5월 10일
·
0개의 댓글
·
post-thumbnail

Bean Scope

스프링 공식문서에서 총 6개의 빈 스코프를 볼 수 있다. 기본적으로 싱글톤 스코프를 가진다. 다음과 같이 같은 빈에 대해서 equal 비교를 했을 때 true 결과를 볼 수 있다. 스코프를 임의로 변경할 수 있는데 @Scope 어노테이션을 이용해 바꿀 수 있다. 아래와 같이 빈 클래스 파일에서 PROTOTYPE 스코프로 바꿀 수 있다. 스코프를 변경 후 equal 비교를 했을 때 다른 객체임을 확인할 수 있다. ![](https://velog.velcdn.com/images/leehanju408/po

2023년 4월 19일
·
0개의 댓글
·
post-thumbnail

컴포넌트 스캔

컴포넌트 스캔으로 빈 등록 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 직접 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있다. Stereotype 애노테이션을 이용하면 스캔대상을 지정한다. 스프링에서는 @Component, @Controller, @Service, @Configuration 등을 사용한다. 예제 기존 AppConfiguration 코드에서 VoucherService, OrderService를 빈으로 등록하는 코드를 제거한다. 다음과 같이 AppConfiguration 코드에 @ComponentScan 어노테이션을 붙여 컴포넌트 스캔으로 빈을 등록한다. AppConfiguration에서 등록한 빈들은

2023년 3월 13일
·
0개의 댓글
·
post-thumbnail

Circular Dependency

A -> B 를 참조하고, B -> A를 참조할 경우 순환 의존관계를 형성한다. 이는 BeanCurrentlyInCreationException을 발생한다. 다음은 순환 의존관계를 가지는 코드다. 실행하면 다음과 같이 오류를 볼 수 있다. 애플리케이션을 실행하면 이제 스프링 컨테이너(IoC)는 A 빈을 생성하기위해 B를 주입해줘야하기 때문에 B를 찾는다. 근데 B를 생성하려 하니 A를 주입하기위해 A를 찾게되면서 무한 반복이 생긴다.

2023년 3월 10일
·
0개의 댓글
·
post-thumbnail

Dependency Injection

IoC는 다양한 방법으로 만들 수 있다. 전략 패턴, 서비스 로케이터 패턴, 팩토리 패턴, 의존관계 주입 패턴들이 있다. 지금까지 쓴 생성자를 통해서 객체를 주입받는 패턴을 생성자 주입 패턴(DI)이라고 부른다. 스프링은 생성자 주입을 권장한다. 애플리케이션 구성 요소를 불변 객체로 구현하고 필요한 종속성이 null이 되지 않도록 보장한다. 생성자의 파라미터는 항상 초기화된 상태로 클라이언트 코드로 반환된다. [https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-setter-injection](https://docs.spring.io/spring-framework/docs/current/refe

2023년 3월 9일
·
0개의 댓글
·
post-thumbnail

ApplicationContext

IoC 컨테이너는 객체에 대한 생성과 조합이 가능하게하는 프레임워크다. 스프링에서는 IoC 컨테이너를 ApplicationContext인터페이스로 제공한다. ApplicationContext는 BeanFactory를 상속한다. 객체에 대한 생성, 조합, 의존관계 설정 등을 제어하는 IoC 기본기능은 BeanFactory에서 담당한다. Bean은 IoC 컨테이너에 의해 관리되는 객체다. ![](https://velog.velcdn.com/images/leehanju408/post/8421d6be-a931-43e

2023년 3월 8일
·
0개의 댓글
·
post-thumbnail

제어의 역전

IoC 제어의 역전이란 이런 제어의 흐름의 역전이 되는것을 말한다 . IoC 상황에서는 객체가 자신이 사용할 개체를 스스로 선택하지 않고 스스로 생성도 하지 않는다 . 라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어하지만 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다. 프레임워크가 흐름을 주도하면서 개발자가 만든 애플리케이션 코드를 사용하는 것이다. 즉 , 애플리케이션 코드가 프레임워크가 짜놓은 틀에서 수동적으로 동작한다. 이를 Hollywood Principle이라고도 한다. 예제 현재 실행 클래스에서 Order 엔터티가 사용할 클래스 FixedAmountVoucher를 결정하고 해당 클래스의 객체를 직접 생성한다. 또한 Order 객체도 여기서 직접 생성한다. 즉 모든 종류의 작업을 사용하는 쪽에서 제어를 하는 구조다. 이를 간단하게 애플리케이션의 주요 객체에 대해서 생성과 관계설정을 하는 OrderCont

2023년 3월 7일
·
0개의 댓글
·
post-thumbnail

의존성

의존성 어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이의 의존성이 존재하게 된다. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다. 컴파일타임 의존성: 코드를 작성하는 시점에서 발생하는 의존성. 클래스 사이의 의존성. 런타임 의존성: 애플리케이션이 실행되는 시점의 의존성. 객체 사이의 의존성. 결합도 결합도란 "하나의 객체가 변경이 일어날 때에 관계를 맺고 있는 다른 객체에게 변화를 요구하는 정도"라고 볼 수 있다. 어떤 두 요소 사이에 존재하는 의존성이 바람직할 때 두 요소가 느슨한 결합도 또는 약한 결합도 를 가진다고 말한다. 반대로 두 요소의 의존성이 바람직하지 못할 때 단단한 결함도 또는 강한 결합도를 가진다고 말한다. 예제 다음 Order 클래스는 dicsountAmount 필드를 통해 totalAmount 메소드에서 직접 할인 로직을 정한다. 이를 변경해 Voucher 클래스를 통해 할인

2023년 3월 6일
·
0개의 댓글
·

인터페이스의 기본과 그 의미

추상 메소드만 담고 있는 인터페이스 인터페이스는 다음과 같다. class 대신 interface라는 선언을 쓰고, 메소드는 바디 없이 세미콜론으로 마무리 된다. 위에서 보듯이 메소드의 몸체가 비어 있는 메소드를 가리켜 추상 메소드라 한다. 인터페이스를 대상으로는 인스턴스 생성이 불가능하다. 클래스가 인터페이스를 상속하는 행위는 상속이 아닌 구현이다. 인터페이스 구현에는 다음과 같은 특징이 있다. 구현할 인터페이스를 명시할 때 implements를 사용한다. 한 클래스는 둘 이상의 인터페이스를 동시에 구현할 수 있다. 상속과 구현은 동시에 가능하다. 인터페이스 관련하여 다음 두 특징도 기억해야 한다. 인터페이스의 형을 대상으로 참조변수의 선언이 가능하다. 인터페이스의 추상 메소드와 이를 구현하는 메소드 사이에 오버라이딩 관계사 성립한다. 다음은 인터페이스 문법을 확인하는 예제다. 인터페이스의 본질적 의미 인터페이스

2023년 3월 6일
·
0개의 댓글
·

Day 8

오버로딩과 오버라이딩의 차이점은 무엇인가요? => 오버로딩의 정의는 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다. 오버로딩을 사용하는 이유 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다. 다형성 사용자 편의성 => 오버라이딩은 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것이다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다. 오버라이딩은 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다. 오버라이딩 조건 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다. 예외(Exception)는 부모 클

2023년 3월 2일
·
0개의 댓글
·

Day 7

절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가? => 절차 지향 프로그래밍(Procedural Programming) 순차적인 처리를 중요시 여기며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법 장점 코드의 가독성이 좋다. 코드를 단위화 할 수 있다. 컴퓨터의 처리구조와 비슷해 실행 속도가 빠르다. 단점 각각의 코드가 순서에 따라 실행되어, 변경, 유지보수 및 분석이 어렵다. 변수나 상수 등의 값들을 관리하는 자료형 과 해당 자료형을 사용하는 함수가 분리되어 사용된다. 절차지향 프로그래밍 언어 : C => 객체지향 프로그래밍(Object Oriented Programming) 모든 데이터를 객체(Object)로 취급하여, 객체가 처리 요청을 받았을 때, 객체 내부에 있는 기능을 가져와 사용해 처리하는 기법 모든 객체가 내부의 자료형(Field)와 함수(Meth

2023년 3월 1일
·
0개의 댓글
·
post-thumbnail

Elastic Search - 분석기

분석기 엘라스틱서치는 전문 검색을 지원하기 위해 역인덱싱을 사용한다. 전문 검색은 문자열에서 부분 검색을 수행하는 것이다. 엘라스틱서치는 캐릭터 필터, 토크나이저, 토큰 필터로 구성되어 있는 분석기 모듈을 가진다. 캐릭터 필터 입력받은 문자열을 변경하거나 불필요한 문자들을 제거한다. 토크나이저 문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다. 토큰 필터 분리된 토큰들의 필터 작업을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다. 분석기에는 하나의 토크나이저가 반드시 포함돼야 한다. ![](https://velog.velcdn.com/images/leehanju408/post/37ed

2023년 2월 28일
·
0개의 댓글
·

Day6

웹 서버와 WAS의 차이는? => 웹 서버는 http 요청을 받아들여 HTML 문서와 같은 정적인 콘텐츠를 사용자에게 전달해주는 역할을 한다. 웹 서버의 임무는 대표적으로 다음과 같다. 단순히 저장된 웹 리소스들을 클라이언트로 전달하고, 클라이언트로부터 콘텐츠를 전달받아 저장하거나 처리한다. 사용자로부터 동적인 요청이 들어왔을 때, 해당 요청을 웹 서버 자체적으로 처리하기 어렵기 때문에 WAS에게 요청한다. => WAS 또한 웹서버와 동일하게 HTTP 기반으로 동작한다. 웹 서버가 할 수 있는 기능 대부분이 WAS에서도 처리가 가능하다. 비즈니스 로직을 처리할 수 있어 사용자에게 동적인 콘텐츠를 전달할 수 있다. 주로 DB와 같이 수행한다. 웹서버와 WAS 분리 => WAS는 DB 조회 및 비즈니스 로직을 처리하는 데 집중한다. 따라서 단순한 정적 콘텐츠는 웹 서버에게 맡기고, 기능을 분리해 서버 부하를 방지한다. 또한 WAS에 문제가 생겨 WAS를 재시작

2023년 2월 28일
·
0개의 댓글
·

Day5

@SpringBootTest와 @WebMvcTest의 차이점을 설명해 주세요. => @SpringBootTest를 사용하게 되면 웹 애플리케이션 컨텍스트에 대한 모든 구성이 로드된다. 애플리케이션의 모든 Bean을 스캔해 로드하기 때문에 실제 환경과 동일하게 테스트 할 수 있으나, 시간이 오래걸린다. 주로 통합 테스트에서 사용되는 애노테이션이다. => @WebMvcTest는 Web Layer만 테스트할 때 사용한다. @WebMvcTest(ContollerClassName.class)로 특정 컨트롤러만 인스턴스화 하여 테스트하는 것도 가능하다. 컨트롤러의 의존성은 @MockBean으로 모의 의존관계 생성 및 주입한다. MockMvc객체를 주입받아 해당 객체를 이용하여 테스트 진행한다. 트랜잭션이 무엇인지 설명해 주세요. => 트랜잭션은 DB에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다. 즉 여러 쿼리들을 하나로 묶는 단위를 말한다. 트랜잭션의 특징은 A

2023년 2월 27일
·
0개의 댓글
·

Day4

Parameter와 Argument의 차이에 대해 설명해주세요. => Parameter는 메소드를 정의할 때 사용되는 변수를 의미한다. => Argument는 실제로 메소드를 호출할 때, 넘기는 변수값을 의미한다. 프로세스와 스레드의 차이에 대해 설명해 주세요 => 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다. 프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당 받는다.(code, heap, stack) => 스레드는 이중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다. 멀티 프로세스 => 프로그램을 여러 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것이다. 장점: 의 프로세스가 잘못 되어도 프로그램은 동작한다. 단점: context switching 비용이 발생한다. 멀티 스레드 => 프로그램을

2023년 2월 24일
·
0개의 댓글
·

Day3

MSA(Microservice Architecture)란? => MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할하는 아키텍처다. 각각의 서비스는 API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성한다. 모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장했다. => 장점 일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않는다. 각각의 서비스들은 서로 다른 언어와 프레임워크로 구성될 수 있다. 서비스의 확장이 용이하다. 특정 서비스만 scale in/out이 가능해 트래픽에 유연한 대처가 가능하다. => 단점 서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다. 서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다. 서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다. 모놀리식의 장단점 => 장점 1

2023년 2월 23일
·
0개의 댓글
·