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
다음 테스트 코드에서 @Transactional, @Rollback의 역할을 알아본다. testMember 테스트 메소드 내 memberRepository를 사용하기 위해서 @Transactional 어노테이션이 필요하다. 없으면 다음 에러가 뜬다. Transaction 메소드를 사용하기 위해 필요해 보인다. @Rollback 값은 기본적으로 true다. @Transactional을 통해 DB에 변경사항이 반영이 되지 않고 롤백 된다. 따라서 save를 통한 insert 쿼리를 확인할 수 없다. 이를 확인하기 위해 @Rollback 어노테이션 값을 false로 두어 공부할 때 확인한다. 롤백하지 않으면 위처럼 insert 쿼리를 확인할 수 있다.
Environment ApplicationContext는 EnvironmentCapable 인터페이스를 상속해 environment를 제공한다. EnvirionmentCapable 인터페이스 내용은 다음과 같다. Environment는 애플리케이션의 개발 환경, 테스트 환경, 운영 환경 등을 의미한다. 개발 중에는 H2 DB를 사용하다가 운영 중에는 MySQL을 사용해 환경을 바꿀 수 있다. 스프링의 환경은 Profile과 Property로 제공한다. Profile에 따라 환경이 바뀌고 그에 따라 Property Source가 바뀐다. Properties DB 접속 정보, 서버 포트 정보 등 다양한 정보를 코드 상에 직접 작성하면 배포마다 바꿔야하거나 패스워드 같은 민감한 정
소트웍스 앤솔러지 (저 소트웍스, 마틴 파울러 | 역 이창신 외 4명 | 위키북스 |2009) 의 6장 객체지향 생활 체조 부분에서, 실생활에서 좋은 객체지향 설계 습관을 기를 수 있는 훈련을 소개 한다. 평소 보다 훨씬 엄격한 코드 작성 표준을 제시함으로써 객체지향적인 사고 개발을 돕는다. 규칙 한 메서드에 오직 한 단계의 들여쓰기만 한다. else 예약어를 사용하지 않는다. 모든 원시값과 문자열을 포장(Wrap) 한다. 한 줄에 점(.)을 하나만 찍는다. 줄여쓰지 않는다 (축약금지). 모든 엔티티를 작게 유지한다. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. 1급(First-Class) 콜렉션을 사용한다. 게터(Getter) / 세터(Setter) / 프로퍼티(Property) 를 사용하지 않는다.
Bean Lifecycle Callbacks Bean 생성 생명주기 콜백 @PostConstruce 애노테이션이 적용된 메소드 호출 Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출 @Bean 애노테이션이 initMethod에 설정한 메소드 호출 Bean 소멸 생명주기 콜백 @PreDestroy 애노테이션이 적용된 메소드 호출 Bean이 DisposableBean 인터페이스 구현시 destroy 호출 @Bean 애노테이션의 destroyMethod에 설정한 메소드 호출 다음과 같은 코드로 확인할 수 있다. 실행 결과 콜백 메소드 순서는 다음과 같다. 빈을 정의할 때 @Bean 어노테이션의 initMethod 속성을 이용해 초기화 메소드를 지정할 수 있다. 실행 결과는 다음과 같고 init 메소드가 나중에 실행된다.
스프링 공식문서에서 총 6개의 빈 스코프를 볼 수 있다. 기본적으로 싱글톤 스코프를 가진다. 다음과 같이 같은 빈에 대해서 equal 비교를 했을 때 true 결과를 볼 수 있다. 스코프를 임의로 변경할 수 있는데 @Scope 어노테이션을 이용해 바꿀 수 있다. 아래와 같이 빈 클래스 파일에서 PROTOTYPE 스코프로 바꿀 수 있다. 스코프를 변경 후 equal 비교를 했을 때 다른 객체임을 확인할 수 있다. 는 A 빈을 생성하기위해 B를 주입해줘야하기 때문에 B를 찾는다. 근데 B를 생성하려 하니 A를 주입하기위해 A를 찾게되면서 무한 반복이 생긴다.
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
IoC 컨테이너는 객체에 대한 생성과 조합이 가능하게하는 프레임워크다. 스프링에서는 IoC 컨테이너를 ApplicationContext인터페이스로 제공한다. ApplicationContext는 BeanFactory를 상속한다. 객체에 대한 생성, 조합, 의존관계 설정 등을 제어하는 IoC 기본기능은 BeanFactory에서 담당한다. Bean은 IoC 컨테이너에 의해 관리되는 객체다. 는 부모 클
절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가? => 절차 지향 프로그래밍(Procedural Programming) 순차적인 처리를 중요시 여기며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법 장점 코드의 가독성이 좋다. 코드를 단위화 할 수 있다. 컴퓨터의 처리구조와 비슷해 실행 속도가 빠르다. 단점 각각의 코드가 순서에 따라 실행되어, 변경, 유지보수 및 분석이 어렵다. 변수나 상수 등의 값들을 관리하는 자료형 과 해당 자료형을 사용하는 함수가 분리되어 사용된다. 절차지향 프로그래밍 언어 : C => 객체지향 프로그래밍(Object Oriented Programming) 모든 데이터를 객체(Object)로 취급하여, 객체가 처리 요청을 받았을 때, 객체 내부에 있는 기능을 가져와 사용해 처리하는 기법 모든 객체가 내부의 자료형(Field)와 함수(Meth
분석기 엘라스틱서치는 전문 검색을 지원하기 위해 역인덱싱을 사용한다. 전문 검색은 문자열에서 부분 검색을 수행하는 것이다. 엘라스틱서치는 캐릭터 필터, 토크나이저, 토큰 필터로 구성되어 있는 분석기 모듈을 가진다. 캐릭터 필터 입력받은 문자열을 변경하거나 불필요한 문자들을 제거한다. 토크나이저 문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다. 토큰 필터 분리된 토큰들의 필터 작업을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다. 분석기에는 하나의 토크나이저가 반드시 포함돼야 한다. 로 특정 컨트롤러만 인스턴스화 하여 테스트하는 것도 가능하다. 컨트롤러의 의존성은 @MockBean으로 모의 의존관계 생성 및 주입한다. MockMvc객체를 주입받아 해당 객체를 이용하여 테스트 진행한다. 트랜잭션이 무엇인지 설명해 주세요. => 트랜잭션은 DB에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말한다. 즉 여러 쿼리들을 하나로 묶는 단위를 말한다. 트랜잭션의 특징은 A
Parameter와 Argument의 차이에 대해 설명해주세요. => Parameter는 메소드를 정의할 때 사용되는 변수를 의미한다. => Argument는 실제로 메소드를 호출할 때, 넘기는 변수값을 의미한다. 프로세스와 스레드의 차이에 대해 설명해 주세요 => 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다. 프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당 받는다.(code, heap, stack) => 스레드는 이중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다. 멀티 프로세스 => 프로그램을 여러 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것이다. 장점: 의 프로세스가 잘못 되어도 프로그램은 동작한다. 단점: context switching 비용이 발생한다. 멀티 스레드 => 프로그램을
MSA(Microservice Architecture)란? => MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할하는 아키텍처다. 각각의 서비스는 API를 통해 데이터를 주고 받으며 1개의 큰 서비스를 구성한다. 모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 Monolithic Architecture(모놀리식 아키텍쳐)의 한계점을 극복하고자 등장했다. => 장점 일부 서비스에 장애가 발생해도 전체 서비스에 영향을 끼치지 않는다. 각각의 서비스들은 서로 다른 언어와 프레임워크로 구성될 수 있다. 서비스의 확장이 용이하다. 특정 서비스만 scale in/out이 가능해 트래픽에 유연한 대처가 가능하다. => 단점 서비스가 분리되어 있어 테스트나 트랜잭션 처리 등이 어렵다. 서비스 간에 API로 통신하기 때문에 그에 대한 비용이 발생한다. 서비스 간의 호출이 연속적이기 때문에 디버깅 및 에러 트레이싱이 어렵다. 모놀리식의 장단점 => 장점 1