WS와 WAS의 차이
WS
- 즈니스 로직 작성 불가
- 주로 정적 데이터 처리
- Nginx, Apache 등
WAS
- 비즈니스 로직 작성 가능
- 웹 서버에서 처리하지 못한 동적 데이터 처리
- 정적 데이터 처리도 가능하나 느림
- Tomcat
아파치 톰캣
- 톰캣의 편의를 위해 아파치의 일부 기능을 제공(톰캣 == 아파치 톰캣)
- 로드 밸런싱 같은 특수 상화에서는 아파치 서버를 앞에 두고 톰캣을 연결하는 경우도 존재
대용량 트랙픽 대처
- 스케일 업 : 서버의 하드웨어적인 스펙을 향상 시키는 방식
- 스케일 아웃 : 서버를 여러 대 추가해 시스템을 증가 시키는 방식
CORS?
- 도메인이 다른 2개의 사이트가 데이터 통신시 발생하는 문제
- 서버 내에서 요청이 허락된 도메인에만 데이터를 주기 위해서 존재
- 요청 허락을 위해서는 응답 헤더에 Access-Control-Allow -xxx 같은 내용을 추가 해야 함
서블릿과 디스패처 서블릿
서블릿
- HTTP 통신을 위해 사용되는 자바의 웹 기술
- 공통의 기능을 각각의 서블릿이 처리 해야 함
디스패처 서블릿
- 서블릿의 단점을 해결하기 위해 프론트 컨트롤러 패턴으로 만들어졌으며 스프링에서 제공하는 기술
DI, IoC, AOP
- DI : 외부에서 객체 간의 관계를 결정하는것으로 객체를 직접 생성하는 것이 아닌 외부에서 생성 후 주입 시키는 방식으로 IOC 컨테이너를 구현하는 방법 중 하나
- IoC : 스프링 컨테이너로 불리며, 제어의 역전 즉 객체의 생성과 소멸, 조립및 구성 관리, 의존 관계 주입의 주체가 개발자가 아닌 프레임 워크가 가져가는 것을 의미
- AOP : 관점 지향 프로그래밍으로 공통 부가 기능을 비즈니스 로직에서 추출해 원하는 곳에 적용하는 기술
VO, DTO, DAO, ENTITY
- VO : 실제 데이터를 저장하는 클래스(식별자가 없으며, 불변), 독립적이지 않은 라이프 사이클을 가짐
- DTO : 데이터를 주고 받기 위해 사용되는 클래스
- DAO : DB에 접근해 실제 데이터를 조회 또는 조작하는 클래스(Repository 또는 Mapper)
- ENTITY : JPA에서 테이블과 매핑되는 클래스로 식별자가 존재하며, 독립적인 라이프 사이클을 지님
Spring 에서의 싱글톤
- 스프링에서는 bean 생성 시 기본적으로 싱글톤이 적용되며 스프링 컨테이너에 의해 관리
- 요청이 들어올 때마다 객체를 재생성하지 않고, 만들어진 객체를 공유해 효율적인 사용 가능
- static 메서드나 private 생성자 등을 사용하지 않아 객체지향적 개발 가능
- 테스트가 용이합니다.
@SpringBootApplication?
구성
- @SpringBootConfiguration : 애플리케이션의 구성을 제공하는 애노테이션
- Configuration : 빈을 생성하고 스프링 컨테이너에 등록
- Indexed : 빈을 컨테이너에 등록 시 색인화와 스테레오 타입으로 설정
- @EnableAutoConfiguration : 베이스 패키지로 정의된 경로의 모든 빈을 자동으로 구성하기에 최상위 패키지에 선언
- @ComponentScan : Component 애노테이션이 명시된 클래스를 스프링 컨테이너에 빈으로 등록
MVC 패턴과 Spring MVC
MVC 패턴
- 아키텍쳐 설계를 위한 디자인 패턴
- 모델 : 데이터 저장 역할
- 뷰 : 사용자 인터페이스 역할
- 컨트롤러 : 사용자 요청 처리와 모델과 뷰의 중개 역할
Spring MVC
- 웹 애플리케이션 개발을 위한 MVC 패턴과 멀티스레드 기반의 웹 프레임워크
- 스레드 재사용을 위한 스레드 풀 사용
- 뷰 : 사용자 인터페이스
- 뷰 리졸버 : 뷰의 이름을 통해 알맞은 뷰를 찾음
- 컨트롤러 : 사용자 요청을 받아 처리해 결과를 디스패처 서블릿에 전달
- 핸들러 매핑 : 요청이 어떤 컨트롤러에 온 요청인지 검사
- 디스패처 서블릿 : 사용자 요청을 먼저 받는 서블릿, 요청에 맞는 컨트롤러에 요청을 전달

스레드 로컬
- 각 스레드에 할당되는 공간
- 멀티스레드 환경에서 스레드 로컬에 값 저장후 해제하지 않으면 스레드의 재사용으로 원치않은 동작이 발생 가능
- 대표적으로 Spring Security에서 사용되는 SecurityContextHolder는 스레드 로컬을 사용
SpringMVC 장단점과 SpringBoot
장점
- 의존성 주입을 통해 컴포넌트 간의 결합도를 낮춰 단위테스트에 용이
- 제어의 역전을 통해 빈의 생명주기에 관여하지 않고 개발에 집중
단점
- xml 기반으로 프로젝트 설정에 많은 시간이 소요
- 톰캣과 같은 was를 별도 설치
해결책(SpringBoot 도입)
- 자주 사용되는 라이브러리들의 버전 관리 자동화
- AutoConfig를 통한 복잡한 설정 자동화
- Tomcat와 같은 내장 WAS 제공
- 실행 가능한 Jar로 개발 가능
Spring @Bean, @Configuration,@Component 어노테이션
- 스프링 컨테이너에 빈 관련 애노테이션.
- Bean : 개발자가 직접 관리 불가한 외부 라이브러리 또는 설정을 위한 클래스를 수동으로 빈 등록 시 사용
- Configuration : @Bean 애노테이션을 갖는 클래스의 경우 반드시 명시
- Component : 개발자가 직접 개발한 클래스를 컴포넌트 스캔 방식으로 자동 빈 등록 시 사용
Spring AOP
- JDK 동적 프록시를 이용
- 자바의 인터페이스, 스프링 컨테이너 이외의 환경이나 기술이 필요 없음
단점
- 프록시 적용을 위해 반드시 인터페이스를 생성
- 구체 클래스로 빈을 주입 받을 수 없어 인터페이스로만 주입받아야 함
해결책
- 클래스 상속 기반 프록시를 구현하는 CGLIB 프록시 등장
- 상속을 기반으로 구현되어 final 클래스나 메서드의 프록시 생성이 불가능한 제약이 존재