[Spring] ArgumentResolver (HandlerMethodArgumentResolver)란 무엇일까?
·
TIL/Spring
ArgumentResolver(HandelrMethodArgumentResolver)란 무엇일까?스프링을 사용하면 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있는 걸 볼 수 있다.HttpServletRequest, Model, @RequestParam, @ModelAttribute은 물론 @RequestBody, HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 매우 큰 유연함을 보여준다. 어떻게 이렇게 파라미터를 유연하게 처리할 수 있는 것일까?그 이유가 바로 오늘 알아보고자 하는 ArgumentResolver 덕분이다.정확히는 HandlerMethodArgumentResolver인데 줄여서 ArgumentResolver라고 부른다. 애노테이션 기반 컨트롤러 처리하는 Re..
[Spring] 서블릿 필터와 스프링 인터셉터(Servlet Filter, Spring Interceptor)
·
TIL/Spring
서블릿 필터(Servlet Filter)와 스프링 인터셉터(Spring Interceptor)는 왜 사용하는걸까?만약 우리가 개발을 할 때 로그인 여부를 체크하는 로직을 모든 컨트롤러 쪽에 작성을 한다면 작업이 많이 번거로울 것이다.이렇게 모든 컨트롤러 로직에서 공통으로 관심이 있는 것을 공통 관심사(cross-cutting concern)라고 한다. 이러한 공통 관심사는 스프링의 AOP로도 해결할 수 있지만,웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리할 때는 HTTP Header나 URL의 정보들이 필요한데, 서블릿 필터와 스프링 인터셉터는 HttpServletRequest를 제공하고 있어 편리하게 공통 관심사를 처리할 수 있다. ..
[Spring] Session으로 로그인 기능 구현하기(HttpSession, TrackingModes, Session Timeout)
·
TIL/Spring
오늘은 Session으로 로그인 기능 구현하는 부분에 대해서 정리하려고 한다.기능 구현하는 걸 정리하기 전에 먼저 간단하게 Cookie와 Session이 무엇이고 어떤 차이점이 있는지부터 살펴보자 Cookie와 Session 이란?HTTP 프로토콜의 특징은 클라이언트가 서버에 요청을 했을 때 요청에 맞는 응답을 보낸 후 연결을 끊는 처리방식이다.연결(Connection)을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다.(Stateless 프로토콜)하지만, 개발을 하다보면 데이터 유지가 필요한 경우가 있는데 이런 무상태(Stateless) 경우를 대처하기 위해서 쿠키와 세션을 사용한다. 쿠키는 HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 ..
[Spring] Spring - Bean Validation
·
TIL/Spring
오늘은 Bean Validation에 대해서 정리해보려고 한다!Bean Validation 이란?이전에 정리했던 BindingResult 내용을 살펴보면 검증 부분에 대해서 직접 코드를 작성하였는데, 매번 코드를 작성하는 것도 번거롭고 특정 필드에 대한 검증 로직은 대부분 비슷한 부분에 대해서 검증을 진행한다(ex. 빈 값, 특정 값..) [Spring] Spring Validation-BindingResult(with.thymeleaf)Bean Validation을 사용하기 전에 BindingResult로 검증 로직을 작성하는 것에 대한 내용을 기록하고자 한다. 데이터를 검증하고 문제가 있는 경우 사용자에게 오류 메시지를 보여줌과 동시에 사용자가yelin1217.tistory.com이러한 검증 로직을 ..
[Git] 실수로 삭제한 Branch 복구하기!
·
Git,GitHub
실수로 삭제한 Branch를 복구하는 방법에 대해서 알아보자! 이 방법을 작성하게된 이유는..A 작업을 진행하던 중 우선순위가 더 높은 업무가 생겨 진행하고 있던 A작업 업무를 중단하고 우선순위가 높은 B 업무를 먼저 진행했다.작업 일정이 좀 길어서 작업하다가 브랜치가 많이 쌓여있어 삭제를 했고 A작업을 다시하려고 기록을 찾아보니 브랜치를 삭제해버렸다. A 작업을 생각보다 좀 진행했어서 브랜치를 살려야 겠다는 마음에 구글링을 했고, 살릴 수 있는 방법이 있어 복구에 성공!!그 방법을 기록해보려고 한다.일단 터미널에서 git reflog 명령을 이용하여 최근 작업내용들을 모두 확인해야 한다.git reflog  위와 같이 명령어를 입력하면 아래 이미지처럼 커밋 내역과 헤드번호가 나온다.  자신이 살려야 하..
[TIL/JPA] 기본개념 : 벌크 연산
·
TIL/JPA
벌크 연산 설명과 사용법벌크 연산은 말 그대로 여러 데이터를 한꺼번에 변경하는 것을 의미한다. 예를 들어 재고가 10개 미만인 모든 상품의 가격을 10% 상승시키려고 한다면 JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL을 실행시켜야 한다.즉, 아래와 같은 과정으로 실행이 될 것이다.재고가 10개 미만인 상품을 리스트로 조회상품 엔티티의 가격을 10% 증가트랙재션 커밋 시점에 변경감지가 동작변경된 데이터가 100건, 1000건이라면 100번, 1000번의 UPDATE SQL을 실행시킨다. 벌크 연산은...쿼리 한 번으로 여러 테이블 로우 변경(엔티티)executeUpdate()의 결과는 영향받은 엔티티 수를 반환한다.UPDATE, DELETE 지원한다.INSERT(insert into .. sel..
[TIL/JPA] 기본개념 : Named 쿼리
·
TIL/JPA
1. Named 쿼리란?미리 정의해서 이름을 부여해두고 사용하는 JPQL로 이름으로 해당 쿼리를 불러와서 사용할 수 있다.정적 쿼리만 가능하다.어노테이션, XML에 정의할 수 있다.애플리케이션 로딩 시점에 초기화 후 재사용할 수 있다.애플리케이션 로딩 시점에 쿼리를 검증할 수가 있다.(로딩 시점에 파싱을 하고 캐싱을 한다.)2. Named 쿼리 사용해보기Member 엔티티를 가지고 Named 쿼리를 사용해 보겠다.먼저, Member 클래스에 가서 @NamedQuery 어노테이션을 붙여주고, name과 query를 작성해 준다.@Entity@Table(name = "MEMBERS")@NamedQuery( name = "Member.findByUsername", query = "se..
[TIL/JPA] 기본개념 : JPQL에서 엔티티 직접 사용하기
·
TIL/JPA
기본 키 값JPQL에서 엔티티를 직접 사용하면 어떻게 될까??결론을 먼저 말하자면 SQL에서는 해당 엔티티의 기본 키 값을 사용한다. JPQL을 아래와 같이 작성을 하면select count(m.id) from Member m // 엔티티의 아이디를 사용select count(m) from Member m // 엔티티를 직접 사용 SQL은 아래와 같이 나온다. (위의 JPQL 둘 다 같은 SQL을 실행한다)select count(m.id) as cnt from Member m 파라미터로 넘겨도 동일하고,String jpql = "select m from Member m where m = :member"List resultList = em.createQuery(jpql) .setParameter("memb..
[TIL/JPA] 기본개념 : 다형성 쿼리
·
TIL/JPA
위와 같이 설계가 되어있다고 가정을 하고 다형성 쿼리에 대해서 설명을 하겠다. TYPE조회 대상을 특정 자식으로 한정할 수 있다. 예를 들어서 Item 중에 Book, Movie를 조회해라 라고 했을 때 JPQL로 아래와 같이 작성을 하면,select i from Item iwhere type(i) in (Book, Movie) SQL은 아래와 같은 결과가 나온다.select i from iwhere i.DTYPE in ('B', 'M') TREATTREAT는 자바의 타입 캐스팅과 유사하다.상속 구조에서 부모 타입을 특정 자식을 타입으로 다룰 때 사용한다.FROM, WHERE, SELECT(하이버네이트 지원) 사용한다. 예를 들어서 부모인 Item과 자식 Book이 있다.JPQL로 아래와 같이 작성을 하..