스프링 21

[Spring] @ExceptionHandler를 사용해 예외 처리하기

스프링은 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler를 사용한 편리한 예외 처리 기능을 제공한다. 다음은 진행하고 있는 프로젝트에 @ExceptionHandler를 적용한 코드이다. @Getter @AllArgsConstructor public enum ErrorCode { // 400 NOT_SELECTED_TAG(BAD_REQUEST, "수거함 태그는 반드시 한 개 이상 설정해야 합니다."); // 404 // 409 // 500 private final HttpStatus httpStatus; private final String message; } enum 클래스를 만들어 상태 코드와 메세지를 담은 열거형을 정의한다. @Getter public class Collecti..

BACK/SPRING 2024.04.18

[Spring] 스프링 MVC1- 웹 애플리케이션 이해(WAS, 서블릿, 쓰레드)

현재 거의 모든 형태의 데이터를 HTTP 로 전송한다. Web ServerHTTP 기반으로 동작정적 리소스(html, css , js, img..)제공, 기타 부가 기능ex) nginx, apache Web Application Server(WAS)HTTP 기반으로 동작프로그램 코드를 실행해 애플리케이션 로직 수행⇒ HTTP 요청이 오면 사용자에 따라서 다른 화면을 보여줄 수 있음정적 리소스도 제공 가능동적 html, http api(json) 생성 가능서블릿, jsp, 스프링 mvc가 WAS 에서 동작ex) tomcat, jetty WAS는 애플리케이션 코드를 실행하는데 더 특화되어 있다.   Web Server: 정적 리소스 제공하는 서버 WAS: 애플리케이션 로직을 실행하는 서버   WAS가 정적 ..

BACK/SPRING 2024.03.04

[Spring] 스프링 핵심 원리 - 빈 스코프

스코프: 빈이 존재할 수 있는 범위 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입(초기화 메서드까지) 까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프 클라이언트에게 빈을 반환하고, 스프링 컨테이너는 이후에 빈을 관리하지 않음(이후에는 클라이언트가 관리) 컨테이너에 요청할 때마다 새로 생성 스프링 컨테이너에서 빈을 조회할 때 생성되고, 초기화 메서드도 실행 종료 메서드가 호출되지 않음 (클라이언트가 직접 해야함) 프로토 타입 스코프, 싱글톤 빈 함께 사용 시 문제점 public class SingletonWithPrototypeTest1 { @Test void prototypeFin..

BACK/SPRING 2024.03.04

[Spring] 스프링 핵심 원리 - 빈 생명주기 콜백

스프링 빈의 이벤트 라이프 사이클 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존 관계 주입 → 초기화 콜백 → 사용 → 소멸전 콜백 → 스프링 종료 스프링은 의존 관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려줌스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줌 💡 객체의 생성과 초기화(무거운 동작)를 분리하자  빈 생명주기 콜백 지원 3가지 인터페이스(InitializingBean, DisposableBean) InitializingBean 은 afterPropertiesSet() 메서드로 초기화를 지원한다.DisposableBean 은 destroy() 메서드로 소멸을 지원한다.잘 사용 X  설정 정보에 초기화 메서드, 소멸 메서드 지정설정 정보에 @Bean(i..

BACK/SPRING 2024.03.04

[Spring] 스프링 핵심 원리 - 의존관계 자동 주입

의존관계 주입 방법 의존관계 주입 방법은 크게 네가지가 있다.참고로 의존관계 자동 주입은 스프링 컨테이너과 관리하는 스프링 빈이어야 동작한다. 1. 생성자 주입 @Componentpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository..

BACK/SPRING 2024.01.31

[Spring] 스프링 핵심 원리 - 컴포넌트 스캔

컴포넌트 스캔 컴포넌트 스캔: 설정 정보가 없어도 자동으로 스프링 빈을 등록 @Component 어노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록 (@Configuration안에도 Component어노테이션이 있기 때문에 컴포넌트 스캔의 대상이 됨) @Autowired: 의존관계 자동 주입 컴포넌트 스캔을 사용하려면 먼저 @ComponentScan 을 설정 정보에 붙여주면 된다. 컴포넌트 스캔을 쓰면 빈이 자동으로 등록되는데, 의존관계를 설정해줄 수 없으므로(이전 Appconfig 처럼 의존관계를 수동으로 등록 불가) 생성자에 @Autowired를 사용해 생성자의 매개변수 타입에 맞는 빈 객체를 스프링이 찾아 자동으로 주입해준다. 정리: 1. @ComponentScan은 @Component가 붙은 ..

BACK/SPRING 2024.01.31

[Spring] 스프링 핵심 원리 - 싱글톤 컨테이너

스프링 없는 순수한 DI 컨테이너 AppConfig는 고객이 요청하는 만큼 객체를 생성해 반환 - 메모리 낭비 싱글톤: 클래스의 인스턴스가 딱 1개만 생성되는 디자인 패턴 private 생성자를 사용해 외부에서 임의로 new 키워드를 사용하지 못하도록 함 public class SingletonService { private static final SingletonService instance = new SingletonService(); // JVM이 맨처음 실행할 때 static 영역을 초기화 하면서 딱 한번 객체를 하나 생성 public static SingletonService getInstance(){ // 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용 return ..

BACK/SPRING 2024.01.30

[Spring] 스프링 핵심 원리 - 스프링 컨테이너와 스프링 빈

스프링 컨테이너 생성 스프링 컨테이너 생성 -> 스프링 빈 등록 -> 의존 관계 설정 1. 스프링 컨테이너 생성 ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); // 구현체 ApplicationContext: 스프링 컨테이너, 인터페이스 스프링 컨테이너는 xml or 애노테이션 기반의 자바 설정 클래스(AppConfig)로 생성 가능 AppConfig.class로 구성 정보 지정 2. 스프링 빈 등록 설정 클래스에 @Bean 이 붙은 메서드 이름을 키로 해서 객체를 스프링 빈으로 등록 *빈이름 직접 부여 가능: @Bean(name=”memberService2”) *빈 이름은 항상 ..

BACK/SPRING 2024.01.30

[Spring] 스프링 핵심 원리 - 객체 지향 원리 적용(+ DI, IoC, 스프링 컨테이너)

memberRepository 인터페이스를 두 repository가 구현한다. memberService는 memberRepository 인터페이스만 의존하도록 한다. package com.hello.core.member; public class MemberServiceImpl implements MemberService{ //private final MemberRepository memberRepository = new MemoryMemberRepository(); // 실제 할당하는 부분이 구현체를 의존 // 인터페이스, 구현체 모두 의존 => dip 위반 private final MemberRepository memberRepository; // 추상화에만 의존하도록 한다. public MemberS..

BACK/SPRING 2024.01.30

[Spring] 스프링 핵심 원리 - 객체 지향 설계와 스프링

스프링의 탄생 2000년대 초반 자바 진영에서는 EJB가 표준 기술이였다. 트랜잭션 관리, 분산 기술등의 장점 하지만 비싸고 어렵다. 복잡하고 느리다 → 스프링과 하이버네이트 탄생 표준 인터페이스 : JPA JPA 구현체들: 하이버네이트, eclipseLink… 스프링은 EJB의 문제점을 지적하면서 등장하였고, 이름은 전통적인 J2EE(EJB)라는 겨울을 넘어 새로운 시작이라는 뜻으로 짓게 됨 스프링이란? 스프링 데이터: CRUD를 편리하게 사용 가능 (스프링 데이터 JPA 기술 많이 사용) 스프링 세션: 세션 기능을 편리하게 사용 가능 스프링 시큐리티: 보안 관련 스프링 RestDocs: API 문서와 테스트를 엮어 문서화를 편하게 해주는 것 스프링 배치: 배치처리(실시간으로 대량 데이터를 업데이트)에..

BACK/SPRING 2024.01.30