applicationContext 초기화(refresh) 이전에 작업이 필요할 경우 ApplicationContextInitializer initialize 메소드에 구현하여 사용 public class XXInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext){ //로직 구현 } } web.xml contextInitializerClasses XXInitializer
Client에서 Server로 데이터를 전송할 때 HTTP Request Headers에 content-type 설정에 따라 HTTP Request Message Body 데이터 포멧이 달라지기 때문에 Server에서 데이터 수신 방식이 달라짐 application/x-www-form-urlencoded HTML form, .ajax 요청 헤더에 default content-type 값 key=value 포멧 Server Side 서블릿에서 Request Body를 Map 형태로 변환 Controller에서 @RequestParam, request.getParameter("param"), @ModelAttribute Command 객체 바인딩 가능 application/json {"key" : "valu..
EntityManagerFactory JPA를 동작시키기 위한 기반 객체를 만들고 DB 커넥션 풀 생성 META-INF/persistence.xml 에 있는 정보를 바탕으로 생성 생성 비용이 크기 때문에 한번만 생성하고 공유해서 사용 여러 스레드가 동시에 접근해도 안전. 공유 가능 EntityManager 엔티티를 저장, 수정, 삭제, 조회 등 모든 일을 처리. 가상의 데이터베이스 엔티티 매니저 팩토리에서 엔티티 매니저를 생성. 비용은 거의 들지 않음 여러 스레드가 동시에 접근하면 문제 발생. 공유 금지 DB 연결이 꼭 필요한 시점까지 커넥션을 얻지 않음. 트랜잭션을 시작할 때 커넥션을 획득 영속성 컨텍스트 (Persistence Context) 엔티티를 영구 저장하는 환경 엔티티 매니저는 영속성 컨텍스..
SQL을 직접 다룰 때 발생하는 문제점 진정한 의미의 계층 분할이 어렵다 엔티티르르 신뢰할 수 없다 SQL에 의존적인 개발을 피하기 어렵다 JPA Java ORM(Object-Relation Mapping) 기술 표준 API 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결 정교한 객체 모델링을 할 수 있고 객체지향 개발에 집중할 수 있다 생산성 : SQL을 작성하고, JDBC API를 사용하는 반복적인 일을 JPA가 대신 처리 유지보수 : JPA가 대신 처리해주므로 수정해야할 코드가 줄어듦 패러다임의 불일치 해결 : 상속, 연관관계, 객체 그래프 탐색, 비교하기 해결 성능 : 애플리케이션과 DB 사이에서 다양한 성능 최적화 기회 제공 데이터 접근 추상화와 벤더 독립성 : 특정 DB 기..
Filter, Interceptior, AOP 모두 공통으로 사용되는 로직을 분리한 것으로 비지니스 로직 실행 전, 후에 추가적인 행동을 할 때 사용 Filter DispatcherServlet 앞에서 요청과 응답을 정제하는 역할 인코딩 변환, XSS 방어 web.xml에 설정 init(), doFilter(), destroy() 메서드 사용 Interceptor DispatcherServlet이 컨트롤러 호출 전후 요청과 응답을 가로채어 추가 로직 실행 로그인, 권한 체크 HandlerInterceptor 인터페이스를 구현해서 스프링 설정 클래스에 addInterceptors()로 적용할 경로 지정 preHandler(), postHandler(), afterCompletion() 메서드 사용 AOP ..
HTTP 프로토콜은 비연결지향 : 클라이언트가 request를 서버에 보내면, 서버는 클라이언트에게 response 리턴 후 연결 해제 웹 페이지에서 머무르는 동안 사용자의 정보를 유지하기 위해 세션, 쿠키를 사용 Session 웹 서버에 접속한 후 서버에서 상태를 유지하는 기술 로그인 상태 사용자 정보가 서버에 저장되어 쿠키보다 보안성 높음 웹 브라우저 캐시에 저장되어 브라우저 종료 시 세션 삭제 Controller 메서드에 HttpSession, HttpServletRequest.getSession() 사용 Cookie 클라이언트에 파일로 사용자 정보를 저장하는 기술 로그인 ID 저장, 팝업 제한 사용자 정보가 클라이언트에 저장되어 보안성 낮음 일정 기간 동안 저장 가능 Controller 메서드에 ..
MVC Model-View-Controller 소프트웨어 아키텍처 패턴 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. Spring MVC @EnableWebMvc : 스프링 MVC 사용을 위한 다양한 Bean 설정을 추가 해준다 WebMvcConfigurer 인터페이스 : 스프링 MVC의 개별 설정을 조정할 때 사용 DefaultServlet, ViewResolvers DispatcherServlet은 웹 브라우저의 요청을 받기 위한 창구 역할, 요청 흐름을 제어하는 역할 스프링 컨테이너를 생성 : HandlerMapping, HandlerAdapter, ViewResol..
Connection Pool 일정 개수의 DB 커넥션을 미리 만들어두는 기법 커넥션을 사용하는 시점에서 커넥션을 생성하는 시간을 아낄 수 있다. 동시 접속자가 많더라도 커넥션을 생성하는 부하가 적기 때문에 더 많은 동시 접속자를 처리할 수 있다. DataSource 커넥션 풀 기능을 제공하는 JDBC 모듈의 구현 클래스 Spring에서 DB 연동은 DataSource를 사용해서 DB Connection을 구한다 DataSource를 Bean으로 등록하고 DB 연동 기능을 구현한 Bean 객체는 DataSource를 주입받아 사용 JdbcTemplate Connection, Statement, ResultSet을 직접 사용하지 않고 편리하게 쿼리를 실행할 수 있다 DAO 클래스에서 JdbcTemplate ..
프록시 (Proxy) 핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체 AOP 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법 공통 기능 : 트랜잭션, 로깅, 보안 Advice : 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의 Before Advice : 대상 객체의 메서드 호출 전에 실행 After Returning Advice : 대상 객체의 메서드가 익셉션 없이 실행된 이후에 실행 After Throwing Advice : 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우 실행 After Advice : 익셉션 발생 여부 상관없이 대상 객체의 메서드 실행 후 실행 Around Advice : 대상 객체의 메시드 실행 전, ..
Spring DI 의존 : 한 클래스가 다른 클래스의 메서드를 실행할 때 '의존'한다 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식 : 생성자, setter() 생성자 방식 : Bean 객체를 생성하는 시점에 모든 의존 객체가 주입 생성자의 파라미터 수가 많아지면 생성자 코드를 확인해야함 setter() 방식 : 메서드 이름을 통해 어떤 의존 객체가 주입되는지 알 수 있음 필요한 의존 객체가 전달받지 못해도 Bean 객체가 생성되기 때문에 문제 객체를 생성하고 의존 객체를 주입하는 기능을 분리하여 변경의 유연함 : @Configuration Spring 설정 클래스 ApplicationContext(BeanFactory)는 Bean 객체의 라이프 사이클을 관리 : 스프링 컨..