spring(12)
-
[Spring Data JPA] 사용자 정의 Repository
일반적으로 Spring Data JPA를 활용하면 인터페이스만 정의하고 그에 대한 구현체는 정의하지 않는다 왜냐하면 Spring의 ProxyFactory에 의해서 정의한 인터페이스에 대한 "프록시"를 생성하고 이 프록시 내부적으로 실제 JpaRepository의 구현체인 "SimpleJpaRepository"를 호출하도록 설계되었기 때문이다 private final MemberRepository memberRepository; @Test @DisplayName("Spring Data JPA 인터페이스 프록시 확인") void proxyTest() { System.out.println(memberRepository.getClass()); assertThat(AopUtils.isAopProxy(memberR..
2022.08.23 -
[Spring Data JPA] 쿼리 메소드 기능
더보기 ## 쿼리 메소드 기능을 테스트할 기본적인 엔티티 구성 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; @Column(name = "user_name", length = 50) private String username; private Integer age; @Enumerated(EnumType.STRING) private MemberType type; @Column(..
2022.08.18 -
[Spring] Spring Transaction
자바에서 DB에 접근하기 위해서는 "JDBC API"를 활용해서 DB에 접근할 수 있다 간단하게 DB에 접근해서 데이터를 받아오는 과정을 설명하면 다음과 같다 1. DB Connection 얻기 2. DB에 보낼 쿼리를 생성하고 Statement or PreparedStatement를 통한 쿼리 flush 3. DB에 쿼리를 보내고 그에 따른 결과 데이터들을 ResultSet을 통해서 받기 4. ResultSet에 담긴 쿼리 결과 데이터들을 원하는 형태로 parsing해서 사용 여기서 또 DB에 접근하는 방식은 3가지로 나눌 수 있다 1. 순수 JDBC 순수한 Native Query를 생성해서 DB로 날리고 그에 대한 결과를 parsing해서 사용하는 방식이다 순수 JDBC API 사용 1. SQL 생성..
2022.08.03 -
[Spring] API 예외 처리
[Spring] 예외 처리 & 오류 페이지 Servlet 예외 처리 1. Exception Exception은 중간에서 "catch"를 통해서 잡을 수 있고, 아니면 계속 "throws"를 통해서 던질 수 있다 웹 애플리케이션은 Request마다 별도의 thread가 할당되고 이 thread는 서블.. cs-ssupport.tistory.com 이전에는 예외가 발생했을 때 "오류 페이지"를 Client에게 내려주는 여러 방법들을 알아보았다 예외가 터지면 WAS에서 다시 "오류 페이지를 위한 REQUEST"를 보낸다 이 때 Request의 DispatcherType은 "ERROR" 하지만 서버가 앱 개발자와 통신을 하거나, 프론트엔드 API형식의 통신을 할 경우는 예외 처리가 달라진다 왜냐하면 이러한 AP..
2022.07.12 -
[Spring] 예외 처리 & 오류 페이지
Servlet 예외 처리 1. Exception Exception은 중간에서 "catch"를 통해서 잡을 수 있고, 아니면 계속 "throws"를 통해서 던질 수 있다 웹 애플리케이션은 Request마다 별도의 thread가 할당되고 이 thread는 서블릿 컨테이너 내부에서 수행된다 그런데 갑자기 예외가 터졌는데 이 예외를 잡지 않고 계속 throw를 하다가 결국 서블릿 외부까지 넘어간다면 어떻게 동작될까?? >> 최종적으로 WAS까지 전파된다 예외를 전파받은 WAS는 뒤에 설명하겠지만 예외 페이지를 Client에게 보여주기 위해서 "예외 전용 Request"를 또 다시 컨트롤러에게 요청한다 간단한 예제를 통해서 정상 흐름과 예외가 터졌을 때의 흐름을 살펴보자 LogFilter @Slf4j public..
2022.07.11 -
[Spring] 스프링 인터셉터
[Spring] Servlet "Filter" 현재 Controller에 의해서 매핑되는 Page가 다음 종류가 있다고 하자 1. 로그인 하지 않고 접근 가능 2. 로그인 해야 접근 가능 >> 여기서 과연 "로그인 해야 접근 가능한 페이지"가 진짜 로그인을 해야 cs-ssupport.tistory.com 이전에는 서블릿에서 제공해주는 "서블릿 필터"를 통해서 Request에 대한 필터링을 해주었다 이번에는 Spring에서 제공해주는 "스프링 인터셉터"를 알아보자 서블릿 필터 & 스프링 인터셉터 모두 웹과 관련된 "공통 관심 사항"을 처리하지만 적용되는 순서도 다르고 적용되는 방법또한 약간 다르다 Spring Interceptor Servlet Filter는 서블릿이 호출되기 전에 수문장 역할을 수행했지만..
2022.07.10 -
[Spring] 서블릿 필터
현재 Controller에 의해서 매핑되는 Page가 다음 종류가 있다고 하자 1. 로그인 하지 않고 접근 가능 2. 로그인 해야 접근 가능 >> 여기서 과연 "로그인 해야 접근 가능한 페이지"가 진짜 로그인을 해야만 접근 가능한지 확인해보자 /members/1로 접근 결과로 알수있듯이 "로그인 후 전용 마이페이지"가 로그인을 하지 않은 사용자에게도 접근이 허용되고 있다 >> "URL"에 따라서 request를 필터링할 수 있게 도와주는 기능을 Servlet에서 제공해준다 : Servlet Filter Servlet Filter Servlet Filter는 Servlet이 제공해주는 "Request Filtering" 기능이고 일단 필터의 흐름부터 알아보자 Servlet Filter는 수문장 역할을 수행..
2022.07.10 -
[Spring] Session
[Spring] Cookie HTTP는 Stateless한 프로토콜이므로 이전에 보낸 Request에 대해서 기억하지 못한다 이러한 Stateless한 특징을 해결하기 위해서 "쿠키"라는 개념을 활용한다 예를 들어서 로그인을 한다고 하자 어떤 사 cs-ssupport.tistory.com "쿠키"는 HTTP의 Stateless로 인해 탄생한 "유지를 위한 수단"이다 쿠키를 통해서 중요한 정보를 보관할 수 있고 쿠키를 통해서 Client & Server간에 인증을 간편하게 할 수 있었다 하지만 쿠키에는 여러가지 보안 이슈가 존재한다 가장 대표적인 보안 이슈는 쿠키에 Client의 중요 정보가 담길 수 있다는 것이다. 따라서 이러한 보안 이슈를 해결하려면 "중요한 정보들은 모두 서버에 저장"해야 하고 Cli..
2022.07.08 -
[Spring] Cookie
HTTP는 Stateless한 프로토콜이므로 이전에 보낸 Request에 대해서 기억하지 못한다 이러한 Stateless한 특징을 해결하기 위해서 "쿠키"라는 개념을 활용한다 예를 들어서 로그인을 한다고 하자 어떤 사용자가 "A-1"라는 페이지에서 로그인을 하고나서 "A-2" 페이지로 이동하였다고 하자 stateless한 HTTP 특징에 의하면 A-2 페이지에서도 로그인을 유지하려면 query parameter를 통해서 로그인 정보를 유지해야 한다 여기서 이러한 상태 유지를 위해서 "쿠키"를 사용하는 것이다 Cookie 쿠키에는 2가지 종류가 존재한다 세션 쿠키 : 브라우저가 종료되면 사라지는 쿠키 영속 쿠키 : 브라우저가 종료되어도 "지정한 만료일"까지 유지되는 쿠키 기본적인 쿠키 로그인 테스트를 위해..
2022.07.07 -
[Spring] 검증(Validation) 2. Bean Validation
[Spring] 검증(Validation) 1. 직접 구현하기 MVC 패턴에서 Controller는 request로 들어온 URL에 대한 처리도 하지만, HTTP Request 자체가 정상인지 "검증"하는 역할도 수행한다 물론 Front쪽에서 검증을 할 수 있지만, 이는 Client가 의도적인 조작을 통 cs-ssupport.tistory.com 앞에서 검증 기능을 직접 작성함으로써 객체에 대한 검증을 하였다 그런데 검증 기능을 매번 코드로 작성하려면 엄청난 시간과 노력을 투자해야 한다 그리고 대부분의 검증 로직은 {빈 값인지 아닌지 / 특정 크기를 넘는지 아닌지 / ...} 등 매우 일반적인 로직이다 이러한 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것이 바로 "Bean Val..
2022.07.03 -
[Spring] 검증(Validation) 1. 직접 구현하기
MVC 패턴에서 Controller는 request로 들어온 URL에 대한 처리도 하지만, HTTP Request 자체가 정상인지 "검증"하는 역할도 수행한다 물론 Front쪽에서 검증을 할 수 있지만, 이는 Client가 의도적인 조작을 통해서 우회해서 접근할 수 있기 때문에 Front쪽에서 1차 검증을 한 후, 2차적으로 Server에서 검증을 해야 한다 BindingResult BindingResult를 활용하면 request로 들어온 data에 대한 오류를 간단하게 담을 수 있고 model을 통해서 자동으로 넘겨줄 수 있다 BindingResult가 "없다면" 400 error가 발생하면서 컨트롤러 자체가 호출되지 않는다 반면에 BindingResult가 "있다면" 오류 정보를 BindingRes..
2022.07.03 -
[Spring - 기본] 객체 지향 설계와 스프링
좋은 객체 지향 프로그래밍? 객체 지향의 특징은 매우 기본적인 다음 4가지이다 추상화 캡슐화 상속 다형성 "객체 지향" 프로그래밍의 의미는 "절차 지향" 프로그래밍에서 전체적인 명령어를 하나의 흐름으로 보고 처리하는 것과 달리 전체적인 명령어를 "여러개의 독립적인 객체"로 나누어서 프로그래밍 하자는 것이다 여기서 나누어진 "독립적인 객체들"은 서로 메시지를 주고받을 수도 있고 데이터를 처리할 수도 있다 :: "협력" 그리고 "다형성"이라는 강력한 특징을 활용해서 프로그램을 유연하고 변경이 용이하게 만들 수 있다 유연하고 변경이 용이하다는 의미는 집에 있는 콘센트?의 개념과 비슷하다 콘센트라는 것은 규격이 정해져있고 규격에 맞는 플러그들은 전부 꽂을 수 있다 다형성 다형성의 의미는 매우 모호하지만 결론적으..
2022.05.11