스프링 프레임워크를 이용하여 트랜잭션을 적용할 때는 @Transactional 애노테이션을 통해 선언적 트랜잭션 방식을 사용한다. 그런데 이 기능은 매우 편리하게 트랜잭션 관련 코드를 대체해 주지만, 실제로 트랜잭션 관련 코드가 눈에 보이지 않고 AOP를 기반으로 동작하기 때문에 실제 트랜잭션이 적용되고 있는지 확인하기 어렵다. 이때, 트랜잭션이 TransactionSynchronizationManager 라는 클래스를 활용하여 확인할 수 있다. 트랜잭션 적용 확인 import org.springframework.transaction.support.TransactionSynchronizationManager; 위의 패키지의 TransactionSynchronizationManager가 제공하는 메서드를 ..
Lombok이란? Lombok이란 반복되는 메서드를 Annotation을 사용해서 자동으로 작성해 주는 Java의 라이브러리이다. 보통 Model, Entity의 경우 여러 속성이 존재하고, 이들의 속성들에 대해 Getter Setter 등의 메서드를 반복해서 작성해줘야 하는 경우가 많다. Lombok은 이 부분을 Annotation으로 대체하여 코드를 생성해 준다. Lombok을 이용해서 작성한 코드는 컴파일 과정에서 IDE가 Annotation을 이용해서 코드를 생성하고, 그 코드가. class에 담기게 되는 것이다. 귀찮은 반복 작업을 줄여준다는 점에서 매우 편리하고, 많이 사용하지만 남용해서는 안된다. 다른 라이브러리와의 충돌이 발생할 수도 있고, 내가 원하는 대로 동작하지 않을 수도 있기 때문이..
쿠키 로그인 기능이 있는 서비스를 개발하다 보면, 로그인 시 이용할 수 있는 페이지와 그렇지 않은 페이지가 있다. 같은 화면도 로그인 이용자에게 보여줄 화면과 비로그인 이용자에게 보여줄 화면을 다르게 설정해야 할 때도 있다. 이때, 쿠키를 사용해서 로그인 정보를 관리할 수 있다. 서버에서 클라이언트로 loginId가 담긴 쿠키를 전달하고, 클라이언트에서는 그 쿠키를 저장해 뒀다가 HTTP 요청 시 서버로 전달한다. //Cookie 생성자 Cookie idCookie = new Cookie( String name, String value ) //HTTP 응답에 쿠키 담기 response.addCookie( idCookie ); //쿠키 삭제하는 법 idCookie.setMaxAge(0); //..
PRG 패턴 (Post-Redirect-Get) 웹 개발 패턴 중 자주 쓰이는 패턴 중 하나이다. HTTP Post 요청에 대한 응답을 다른 URL로의 GET방식으로 Redirect 하는 것이다. PRG 패턴을 사용하지 않을 때 발생하는 문제 첫 번째로, Post 요청 처리 시 새로고침으로 인해 동일한 요청이 연속적으로 보내지는 오류가 발생할 수 있다. Post 요청을 처리할 때, 변경이 일어나지 않는 로직이라면 상관없지만, Post로 값을 받아 무언가를 변경하는 로직이 있다면 새로고침 했을 때 그 로직이 반복 실행되는 문제가 발생할 수 있다. 두 번째로, Post 요청 처리 후 다른 페이지를 호출하는 경우 해당 페이지를 호출할 때 필요한 파라미터들을 넘겨주지 않아서 문제가 발생할 수 있다. 이런 문제들..
@PathVariable 경로변수 PathVariable을 사용하면 리소스 경로에 식별자를 넣어서 동적으로 URL에 정보를 담을 수 있다. URL 경로의 중괄호 { } 안쪽에 변수를 담고, 그 변수를 @PathVariable(" ")로 받아서 사용할 수 있다. 1. 기본 URL의{postId}와 매개변수 long orderId와 이름을 맞춰준다. @GetMapping ("/order/{orderId}") public String getOrder(@PathVariable String orderId){ log.info("orderId : {}", orderId); return "orderId:"+ orderId; } 요청 : http://localhost:8080/order/123 응답 : orderId:1..
Spring Interceptor 스프링 인터셉터는 스프링 MVC가 제공하는 웹과 관련된 공통 관심사항을 효과적으로 해결할 수 있는 기술이다. 예를 들어 로그인되지 않은 사용자가 로그인해야지만 접근할 수 있는 페이지에 접근하려 할 때, 세션을 확인하여 세션에 로그인된 사용자의 유무에 따라 접근 허용 여부를 설정해 줄 수 있다. 1) 스프링 인터셉터 흐름 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 서블릿 필터는 서블릿이 호출되기 이전에 호출된다. 스프링 인터셉터는 컨트롤러 호출 직전에 호출된다. URL패턴을 서블릿 필터에 비해 정밀하게 설정할 수 있다. 2) 스프링 인터셉터 제한 1. 접근 허용 시 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인..
Validation : 유효성 검증 웹 개발을 하다보면 서버로 들어온 요청이 서버에서 필요한 데이터의 스펙에 잘 맞게 들어왔는지 검사해야할 필요가 있다. 예를들면 '나이'를 입력받아서 서버에 저장해야하는데, Integer타입의 age 변수에 숫자가 아닌 값이 들어오는 경우 오류가 발생한다. 또는 그저 사용자가 오타를 쳐서 잘못된 정보를 기입하는 경우도 생각해 볼 수 있다. 만약 사용자가 오타를 하나 쳤다고 error 페이지가 뜨고, 뒤로 돌아가 처음부터 다시 입력을 해야한다면, 그 사용자는 이 서비스를 이용하고 싶지 않을 것이다. 따라서 웹 서비스는 오류 발생시 친절하게 어디서 어떤 오류가 발생했는지 친절하게 알려주는것이 좋다. 컨트롤러의 중요한 역할중 하나는 HTTP 요청이 정상인지 검증하는 것이다. ..