기본 콘텐츠로 건너뛰기

Spring

AOP
Aspect Oriented Programming

  • 독립적인 모듈화가 불가능한 트랜잭션 경계설정과 같은 부가기능을 모듈화하는 작업
  • Aspect: 핵심기능에 부가되어 의미를 갖는 특별한 모듈
  • AOP는 Aspect를 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것(토비의 스프링)


Transaction
더 이상 나눌 수 없는 단위 작업

  • SQL을 이용해 다중 로우의 수정이나 삭제를 했을 때, 일부는 되고 나머지는 안되는 경우는 없다.
  • DB가 트랜잭션을 보장해 준다고 믿음.
  • 여러 SQL이 실행될 때, 어느 한 SQL이 장애가 발생하면 이전에 실행된 SQL 작업은 취소해야 하는데, 이 취소 작업을 "트랜잭션 롤백"
  • 여러 SQL이 실행될 때, 모든 SQL이 성공적으로 마무리했다면, DB에 해당 SQL 작업들을 확정해야 하는데, 이 확정 작업을 "트랜잭션 커밋"
  • JDBC의 트랜잭션은 default 로 setAutoCommit(true) 이므로, 프로그램적으로 여러개의 SQL에 대하여 트랜잭션 경계설정을 하기 위해서는 autoCommit을 false로 설정해야 한다.


CGLIB
Code Generator Library

  • 런타임에 동적으로 클래스의 프록시를 생성함
  • JDK Dynamic Proxy 보다 더 빠르다. JDK Dynamic Proxy 의 경우 리플렉션을 이용해 인터페이스의 구현 클래스를 위임하는 프록시 클래스를 이용하며, CGLIB는 클래스 파일을 상속받아서 프록시 클래스를 만들어 낸다. JDK Dynamic Proxy(인터페이스 필요), CGLIB(인터페이스 필요없음)
  • AspectJ 는 스프링 컨테이너를 사용하지 않는 경우에도 프록시 클래스 생성을 해주며, 런타임시 바이트코드를 조작하는 방식을 사용한다.

IOC
제어권의 이전을 통한 제어관계 역전
  • 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않고 생성하지도 않는다. 모든 제어 권한은 자신이 아닌 다른 대상에게 위임하기 때문, 모든 오브젝트는 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.
  • 설계가 깔끔해지고 유연성이 증가하며 확장성이 좋아짐.

DI
런타임 의존관계를 설정
  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않기 위해 인터페이스에만 의존하고 있어야 함.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어 짐.
  • 생성자 파라미터를 통한 전달
  • 접근자 파라미터를 통한 전달

DispatcherServlet과 MVC 아키텍처
DispatcherServlet은 Spring이 제공하는 프론트 컨트롤러다.
MVC는 프레젠테이션 계층의 구성요소를 정보를 담은 모델(Model), 화면 출력 로직을 담은 뷰(View), 그리고 제어 로직을 담은 컨트롤러(C)로 분리하고 이 세가지 요소가 서로 협력해서 하나의 웹 요청을 처리하고 응답을 만들어내는 구조다.

  • MVC 아키텍처는 보통 프론트 컨트롤러(front controller) 패턴과 함께 사용된다.
  • 프론트 컨트롤러는 중앙집중형 컨트롤러를 프레젠테이션 계층의 제일 앞에 둬서 서버로 들어오는 모든 요청을 먼저 받아서 처리한다.
  • 프론트 컨트롤러는 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행한 후에 적절한 세부 컨트롤러로 작업을 위임해주고, 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 등의 작업을 수행한다. 예외가 발생했을 때 이를 일관된 방식으로 처리하는 것도 프론트 컨트롤러의 역할이다.
  • 스프링이 제공하는 스프링 서블릿/MVC의 핵심은 DispatcherServlet이라는 프론트 컨트롤러다
  1. 자바 서버의 서블릿 컨테이너는 HTTP 프로토콜을 통해 들어오는 요청이 스프링의 DispatcherServlet에 할당된 것이라면 HTTP 요청정보를 DispatcherServlet에 전달해 준다.(servlet-mapping)
  2. DispatcherServlet에서 컨트롤러로 HTTP 요청 위임(핸들러 매핑 전략: 어댑터 패턴 - 특정 컨트롤러를 호출해야 할때는 해당 컨트롤러 타입을 지원하는 어댑터를 중간에 껴서 호출함. 이는 DispatcherServlet은 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을 수 있다. DefaultAnnotationHandlerMapping, AnnotationMethodHandlerAdapter)
  3. 컨트롤러의 모델 생성과 정보 등록, 컨트롤러의 결과 리턴: 모델과 뷰(ModelAndView: Model(K,V), ViewName)
  4. DispatcherServlet의 뷰 호출과 모델 참조(JSP/JSTL 로 HTML 생성 및 동적 변경 model 값 대입)
  5. HTTP 응답 돌려주기(HttpServletResponse)

출처: 토비의 스프링

댓글

이 블로그의 인기 게시물

Dolphin 3

100자 이내의 짧은 글을 쓸 수 있는 게시판 제공. Dolphin Project에서 가장 메인 서비스는 예적금 시뮬레이터이므로, 다른 기능 구현은 차후로 미뤄뒀지만, 사용자와 소통할 수 있는 최소한의 기능은 제공하는게 맞다는 생각이 들어 아주 단순한 게시판 기능을 제공합니다. 사용자가 글을 쓰려면 로그인을 먼저 해야합니다. 글을 등록 후 삭제할 때 글 작성자를 식별할 수 있어야 하기 때문입니다. 게시판은 Dolphin Frontend Main 페이지에 자리잡았습니다. 사용자가 가장 먼저 만나게 되는 웹페이지이므로 적당하다고 생각합니다. 다음은 로그인을 하기 전 사용자가 볼 수 있는 메인 페이지입니다. 글 상단에는 작성일(MMM-dd-yyyy)과 작성자 고유번호(#numbers)가 노출됩니다. Dolphin 은 네이버 로그인을 사용하기 때문에, 사용자를 식별할 수 있는 정보는 저 고유번호가 됩니다. 하단에는 글 내용이 자리잡습니다. 스크린샷에서는 Hello, world!! 라는 문구가 보이네요. 글은 최대 100자까지 허용합니다. 버튼 두개(Newer, Older) 는 페이징 버튼인데, Newer는 최근페이지로 이동을 하며, Older는 지나간 글을 보는 페이징버튼입니다. 기본 페이지 사이즈는 20개입니다. 오른쪽으로 보이는 글 작성 폼은 현재 로그인 하기 전이므로 textarea 는 disabled 처리되어 있고 Login버튼이 자리잡고 있습니다. 다음은 사용자가 로그인 한 뒤의 메인페이지입니다. 변경된 부분은 사용자 고유번호 뒤에 Remove 버튼이 나타났습니다. 해당 글 작성자가 로그인한 사용자일 경우에만 보이게 됩니다. 오른쪽 글 작성 폼도 이제 활성화 되었습니다. 아주 단순한 Textarea 창과 Submit 버튼이 자리잡고 있습니다. 다음은 작성자가 아닌 다른 사용자가 로그인한 경우 입니다. 사용자 고유번호(#54097272) 옆에 Remove 버튼이...

Dolphin 2

별도의 회원가입 없이 소셜 로그인 기능 제공으로 간편한 로그인 가능. Dolphin 프론트엔드는 회원가입 절차가 따로 없고, 간단하게 소셜 로그인 기능을 제공함으로써 회원가입, 인증절차를 생략했습니다. 우선, 간단하게 국내에서 잘 알려진 네이버의 API를 사용합니다. 네이버 개발자센터 웹사이트 에서 네이버 아이디로 로그인 기능을 살펴봅니다. 개발 문서를 자세히 살펴보고 API 신청을 합니다. 애플리케이션의 이름을 정하고 필요한 정보를 필수/선택에 체크합니다. 밑으로 내려보면 로그인 API 서비스 환경 부분에서 환경 추가 셀렉트박스에서 PC 웹을 선택하면 다음과 같은 입력폼이 나타납니다. 서비스 URL은 내 웹애플리케이션의 URL이 될 예정입니다. 지금은 개발상태이므로 localhost를 입력했습니다. Callback URL은 네이버 OAuth 인증 url로 호출하면, 인증절차 후 네이버에서 리다이렉트해줄 url을 뜻합니다. 저는 /naver/login 으로 했습니다. 등록이 완료되면 client-id와 client-secret 값을 제공해줍니다. 이 값을 이용해서 인증처리를 할 수 있습니다. spring.io 웹사이트의 튜토리얼 문서를 보면 Facebook 소셜 로그인 기능에 대한 설명이 자세하게 나와있습니다. 이 부분을 참고합니다. Spring Boot and OAuth2 pom.xml 파일에 의존성을 추가하고 Application 클래스에 @EnableOAuth2Sso 애너테이션을 선언합니다. 튜토리얼대로 application.yaml 파일(application.properties)에 설정 정보를 입력합니다. clientId, clientSecret 값은 네이버 개발자센터에서 받은 대로 입력합니다. accessTokenUri는 네이버의 경우 https://nid.naver.com/oauth2.0/token 입니다. userAuthorizationUri는 네이버의 경우 https://ni...

냉장고 가계부 프로젝트 35

Spring security 프레임워크에서 form login 방식으로 인증할 경우 Remember-Me 서비스를 제공할 수 있다. Remember-Me 서비스를 이용하면 쿠키에 인증토큰을 저장해두고 일정기간동안(default: 2주) 쿠키에 토큰이 있다면 인증처리를 해준다. 기본적으로 별도의 설정이 없다면 세션은 30분 만료시간으로 정해져있다.(WAS 마다 틀리다.) 세션 시간이 만료되면 세션에 저장된 정보가 날라가므로 다시 로그인을 해야한다. Remeber-Me 기능을 이용하면, form login에서 인증을 성공적으로 진행하는 경우 임의의 인증토큰을 생성해서 쿠키에 저장해두고 쿠키가 만료되기 전까지 쿠키값을 확인해서 인증을 진행한다. 별도의 설정을 하지 않으면 in-memory 기반의 쿠키저장소를 이용해서 쿠키 토큰인증을 하며, JDBC같은 저장소를 별도로 사용할 수도 있다. WebSecurityConfig 클래스에 다음과 같이 간단한 설정만으로 remember-me 기능을 추가할 수 있다. @Configuration @EnableWebSecurity @RequiredArgsConstructor public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final MemberUserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/signup").permitAll() .requestMatchers(PathRequest.toStaticResources().atCommonLocations()...