인프런 강의 보기 토비의 스프링
프로젝트 환경설정
웹 개발에는 크게 정적 컨텐츠, MVC와 템플릿 엔진, API의 세가지 방법이 있다.
스프링 빈을 등록하는 2가지 방법 1. 컴포넌트 스캔과 자동 의존관계 설정 2. 자바 코드로 직접 스프링 빈 등록하기
H2 설치개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면 제공
AOP가 필요한 상황 모든 메소드의 호출 시간을 측정하고 싶다면? 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
스프링이란? 스프링은 특정한 하나가 아니라 여러가지 기술들의 모음 (스프링 프레임워크, 스프링 부트, 스프링 데이터, 스프링 세션, 스프링 시큐리티, 스프링 Rest Docs, 스프링 배치, 스프링 클라우드 등)
새로운 할인 정책 개발 역할과 구현을 분리하고, 다형성을 활용하여 인터페이스와 구현 객체를 분리 하였음 하지만 DIP와 OCP 설계 원칙을 준수하지 않아 직접 클라이언트 코드를 변경해야하는 문제점 발생 DIP : 클라이언트OrderServiceImpl는 추상(인터
스프링 컨테이너 생성 ApplicationContext : 스프링 컨테이너 ApplicationContext는 인터페이스 AnnotationConfigApplicationContext 클래스 는 ApplicationContext 인터페이스의 구현체
웹 애플리케이션과 싱글톤 스프링 없는 순수한 DI 컨테이너는 요청을 할 때 마다 객체를 새로 생성 > 생성하고 소멸하는 과정에서 메모리 낭비 발생 해당 객체가 딱 1개만 생성되고, 공유하도록 설계 > 싱글톤 패턴 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는
컴포넌트 스캔과 의존관계 자동 주입 시작하기 @ComponentScan @Component 애너테이션이 붙은 클래스를 찾아 자동으로 스프링 빈에 등록 AutoAppConfig.java excludeFilters 자동으로 스프링 빈에 등록할 때 뺄것을 지정해주는 것
다양한 의존관계 주입 방법 >스프링 컨테이너의 생성과정 스프링 컨테이너 생성 스프링 빈 등록 스프링 빈 의존관계 설정 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 생성자 호출시점에 딱 1번만 호출되는 것이 보장 주로 불변, 필수 의존관계에 사
빈 생명주기 콜백 시작 >* 스프링 빈의 라이프사이클* 객체 생성 의존관계 주입 생성자 주입은 예외 (객체를 만들 때 스프링 빈이 같이 파라미터에 들어와야 하기 때문에) 초기화 작업 객체를 생성하는 작업이 아니라, 객체 안에 필요한 값이 다 연결되어있고 외부랑 연결되
빈이 존재할 수 있는 범위싱글톤 : 기본 스코프, 가장 생명주기가 길고 스프링 컨테이너의 생명주기와 같은 주기를 가짐프로토타입 : 스프링 컨테이너가 요청받고 빈을 만들어서 제공, 의존관계 주입하고 초기화 메서드까지 불러줌 > 클라이언트에게 반환하고 더이상 스프링 컨테이
웹은 HTTP를 기반으로 통신HTTP 메시지에 모든 것을 전송거의 모든 형태의 데이터 전송 가능서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용HTTP를 기반으로 동작정적 리소스(특정 폴더에 파일을 두면 서버들이 그대로 서빙해주는 것) 제공, 기타 부가기능특정 사
프로젝트 생성 할 때 Jar가 아닌 War로 선택 ! > JSP 사용 가능Jar는 내장 톰캣을 사용War도 내장 톰캣 사용 가능, 또한 톰캣 서버를 별도로 설치하고 War를 넣어 빌드할때도 사용여기선 JSP를 공부해야하기 때문에 JSP를 사용하려면 War를 선택해야함@
서블릿으로 회원 관리 웹 애플리케이션 만들기 MemberSaveServlet.java 서블릿을 사용해 동적으로 원하는 HTML을 만들 수 있음 서블릿으로 자바 코드 실행, 비지니스 로직 실행하는 것은 편리하나 HTML 만드는 것이 굉장히 복잡 > 템플릿 엔진을 사용
프론트 컨트롤러 서블릿에 공통 로직을 모으고 각각 필요한 로직은 각각 처리프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출공통 처리 가능프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨 (프
스프링 MVC의 프론트 컨트롤러가 바로 디스패처 서블릿(DispacherServlet)DispacherServlet 도 부모 클래스에서 HttpServlet 을 상속 받아서 사용하고, 서블릿으로 동작스프링 부트는 DispacherServlet 을 서블릿으로 자동으로 등
War는 주로 톰캣을 별도로 설치할 때 사용, JSP를 쓸 때 사용, 내장 서버도 사용가능 하지만 주로 외부 서버에 배포하는 목적으로 사용 Jar는 별도의 톰캣 서버를 설치하는것이 아닌 내장 톰캣을 최적화해서 사용할 때 사용 로깅 간단히 알아보기 운영 시스템에서는 S
타임리프는 html모양을 그대로 살리면서 뷰 템플릿으로 렌더링 될 때만 조금씩 치환 > 화면을 크게 깨뜨리지 않음타임리프는 순수 HTML을 파일을 웹 브라우저에서 열어도 내용을 확인할 수 있고, 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과를 확인할 수 있음순수
타임리프 소개 타임리프 특징 서버 사이드 HTML 렌더링 (SSR) 타임리프는 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용도로 사용 네츄럴 템플릿 타임리프는 순수 HTML을 그대로 유지하면서 뷰 템플릿도 사용할 수 있음 타임리프로 작성한 파일은 HTML을 유지
타임리프는 스프링 없이도 동작하지만, 스프링과 통합을 위한 다양한 기능을 편리하게 제공th:object 를 적용하려면 먼저 컨트롤러에서 해당 오브젝트 정보를 model로 넘겨주어야 함 (빈 값이여도)th:object="${item}" : <form> 에서 사용할
메세지하드코딩 되어있는 단어들을 별도의 파일에서 관리하도록 하는 기능메세지를 관리하는 곳에서 내용을 변경하면 한번에 모든 파일에 변경된 내용이 적용됨국제화메시지에서 설명한 메시지 파일을 각 나라별로 별도로 관리하면 서비스를 국제화할 수 있음한국에서 접근한 것인지 영어에
검증 요구사항 컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것 클라이언트 검증(주로 자바스크립트), 서버 검증 클라이언트 검증은 조작할 수 있으므로 보안에 취약 서버만으로 검증하면, 즉각적인 고객 사용성이 부족 둘을 적절히 섞어서 사용하되, 최종
Bean Validation - 소개 validation 검증의 제약 조건을 애너테이션으로 넣는 것 Bean Validation은 특정한 구현체가 아니라 검증 애노테이션과 여러 인터페이스의 모음 > 구현체 따로 존재 Bean Validation을 구현한 기술중에 일반
도메인 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함 Item이나 Repository 등.. web은 domain을 의존하지만, domain은 web을 의존하지 않게 설계해야함 출처 [인프런] 스프링 MVC 2
애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋음웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요한데, 서블릿
서블릿의 예외 처리 지원 방법Exception (예외)response.sendError (HTTP 상태 코드, 오류 메시지)Exception이 터졌을 때 기본적으로 WAS는 서버 내부에서 처리할 수 없는 오류가 발생한 것으로 생각해서 HTTP 상태 코드 500을 반환상
오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API 예외 처리는 각 오류 상황에 맞는 오류 응답 스펙을 자율적으로 정하고, JSON으로 데이터를 내려주어야 함ErrorPageController.java오류 페이지 컨트롤러가 JSON 응답을 할 수 있도
스프링 타입 컨버터 소개 개발자가 새로운 타입을 만들어서 변환하고 싶으면 (ex) String "true"로 입력받은 것을 boolean형으로 변환) 스프링이 제공하는 확장 가능한 컨버터 인터페이스를 사용 개발자는 스프링에 추가적인 타입 변환이 필요하면 이 컨버터 인터
파일 업로드 소개 HTML 폼 전송 방식 Content-Type: application/x-www-form-urlencoded HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방법 폼에 입력한 전송할 항목을 HTTP Body에 문자로 & 로 구분해서 전송