목록프로그래밍👩🏻💻/Spring (9)
suyeonme
Spring Cloud Eureka란? Spring Cloud Eureka는 Netflix에서 공개한 OSS Service Registry로 Eureka Client와 Eureka Server로 구성된다. 마이크로서비스들의 정보를 Registry에 등록하고 로드밸런싱을 제공하는 미들웨어서버이다. Eureka는 각각 연결된 서비스의 IP, Port, Instance ID를 가지고 있으며 REST 기반으로 동작한다. Eureka Server에 등록된 마이크로서비스는 Eureka Client라고 부른다. 따라서 마이크로서비스를 Eureka Server에 등록하면 Eureka Client에 대한 정보를 저장하기 때문에 각각의 마이크로 서비스끼리 통신하는 경우, Eureka에서 받아온 정보로 요청을 보낸다. Eu..
@ControllerAdvice, @ExceptionHandler란? @ControllerAdvice @Controller(+@RestController)가 적용된 모든 스프링빈에서 발생하는 예외를 잡아서 처리해주는 어노테이션이다. 아래 예시처럼 {NullPointerException.class, UserServiceException.class}와 같이 여러 클래스를 함께 정의할 수도 있고 단일 클래스만 정의할 수도 있다. 아래와 같이 작성한 경우, 모든 컨트롤러에서 NullPointerException 또는 UserServiceException 커스텀 예외가 발생하는 경우, 아래 클래스가 예외를 잡아서 처리한다. ErrorMessage 클래스처럼 에러 메세지를 위한 객체를 생성한 뒤 클라이언트에 일관된..
@Valid, @Validated javax.validation 패키지에 있는 @Valid 어노테이션을 사용하여 @RequestBody 객체의 유효성을 검사할 수 있다. 스프링부트 2.3버전 이상의 버전에서는 spring-boot-starter-web의 의존성이였던 validation이 제거되었다. 따라서 직접 의존성을 추가해주어야한다. // build.gradle dependencies { //... implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation' } @Valid javax.validation 패키지에 속하는 어노테이션으로 JSR-303 자바 표준 스펙이다. Controller의 메소드에 대한..
로그를 남기는 이유 운영환경에서 어플리케이션에서 문제가 발생한 경우 원인 파악을 하기 위해서는 문제가 발생했을 당시의 정보가 필요하다. 따라서 Exception이 발생했거나, 중요 기능이 실행되는 부분에서는 로그를 남긴다. 로그는 재현하기 힘든 버그에 대한 정보를 제공한다. 로그는 성능에 관한 통계와 정보를 제공한다. 로그 사용시 장점 쓰레드 정보, 클래스 이름등 부가 정보를 출력할 수 있고 출력 포맷을 조정할 수 있다. 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력, 운영 서버에서는 특정 레벨 이상의 로그만 출력하는등의 조절을 할 수 있다. 시스템 아웃 콘솔에 출력 및 파일이나 네트워크등 별도의 위치에 로그를 남길 수 있다.(파일 분할, 파일 압축등) 내부 버퍼링, 멀티스레드등 측면에서 성능이 S..
Scope란 bean이 존재할 수 있는 범위를 의미한다. 아래와 같이 @Scope 애노테이션을 사용하여 bean의 스코프를 지정할 수 있다. @Scope("prototype") @Component public class BeanTest() Scope의 종류 스프링에서 지원하는 스코프의 종류는 아래와 같다. 1. Singleton (default) 2. Prototype 3. Web 관련 1. Singleton Scope 기본(default) 스코프로, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 스프링 빈(bean)을 등록하면 기본적으로 싱글톤 스코프이다. 빈(bean)을 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 스프링 빈을 반환한다. 스프링 컨테이너 생성 시점에 초기..
Controller와 관련있는 자주 사용할 것 같은 애노테이션을 정리했다. @RequestMapping Controller에서 들어온 http request를 method와 매핑(mapping)하게 위해 사용한다. @RequestMapping(value = "URI", method = RequestMethod.GET) @RequestMapping({ "/members", "member_list" })와 같이 복수개의 URL을 등록할 수 있다. method를 지정하지 않으면 모든 요청에 대해서 호출된다. @RestController public class MemberController { @RequestMapping(value = "/member", method = RequestMethod.GET) pub..
1. Dependency Injection(DI)이란? 스프링 컨테이너가 스프링 빈(bean)간의 의존 관계를 외부에서 주입해주는 것을 말한다. 의존 관계 주입을 하기 위해서는 먼저 스프링 컨테이너에 스프링 빈으로 등록해야한다. 스프링에서 제공하는 DI를 사용하지 않으면, 개발자가 직접 의존 관계가 있는 클래스들을 new 키워드를 사용하여 일일이 연결해야하는데 이는 매우 번거롭다. // new 키워드 사용 public class MemberService { private MemberService memberRepository = new MemberRepository(); } // 스프링의 DI 사용 @Service public class MemberService { private final MemberR..
1. Spring Container란? xml이나 annotation등을 사용하여 bean을 생성한다. 스프링 컨테이너는 Bean에 의존성을 주입(dependency injection)한다. 스프링 컨테이너는 인스턴스의 생명주기(생성~소멸) 및 의존성을 관리한다. 따라서 개발자는 비즈니스 로직에만 집중할 수 있다. 2. Spring Bean이란? 스프링 컨테이너가 생성한 객체를 Bean 이라고 한다. 스프링은 스프링 컨테이너에 빈(bean)을 등록할 때 기본적으로 Singleton Scope로 등록한다. 따라서 스프링 빈은 기본적으로 싱글톤(Singleton)이다. 따라서 한개의 인스턴스이며 전역에서 공유된다. 2.1 스프링 컨테이너에 Bean 등록 스프링 컨테이너에 빈을 등록하는 방법은 크게 두가지이다..