본문 바로가기

Java/Spring

Spring Security SessionDestroyListener 스프링 시큐리티에서 세션 디스트로이 이벤트 전후작업 하기. 사용자가 로그아웃할때, 로그를 남겨야한다는 요구사항이 들어왔다. 사용자가 로그아웃 버튼을 클릭해서 로그아웃을 하면, SimpleUrlLogoutSuccessHandler를 상속받아 onLogoutSuccess 메서드를 구현해서 처리할 수 있다. @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { // 전 작업 super.onLogoutSuccess(request, response, authenticatio.. 더보기
Spring Security 로그인 성공 혹은 실패 후 부가 작업 하기. 요구사항. 로그인을 5번 이상 실패하면 계정 잠금 처리. 먼저 사용자 테이블에 로그인 실패 건수를 업데이트할 컬럼을 생성한다. 로그인이 실패하면, 해당 컬럼에 +1 건을 추가하고, 로그인을 성공하면, 0으로 초기화 해주는 로직을 넣어보려고 한다. 스프링 시큐리티를 사용하며, 로그인 성공시 부가 작업을 하려면, org.springframework.security.web.authentication.AuthenticationSuccessHandler를 구현해야 한다. 별도로 authenticationSuccessHandler를 지정하지 않으면 기본적으로 org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler를 사.. 더보기
Thymeleaf에서 날짜 관련 Utility 사용하기. Thymeleaf를 사용할때, 개발자는 꽤 많은 유틸리티를 사용할 수 있다. 그 중, 날짜 관련 유틸인 #dates 는 java.utils.Date 오브젝트를 위한 유틸리티이다. 아래와 같은 표현식을 사용할 수 있다. Dates#dates : utility methods for java.util.Date objects:/* * ====================================================================== * See javadoc API for class org.thymeleaf.expression.Dates * ====================================================================== */ /* * For.. 더보기
Spring Security, 현재 사용자 정보 가져오기. 보통의 Entity(JPA에서의..)는 등록사용자ID, 등록일자를 가지게 된다.package kr.co.xfilegolf.sale; import kr.co.xfilegolf.SecurityUtils; import lombok.Data; import javax.persistence.*; import java.time.LocalDate; import java.time.LocalDateTime; /** * @author jason, Moon * @since 2016-10-09 */ @Entity @Table(name = "SALE") @Data public class Sale { @Id @GeneratedValue @Column(name = "ID") private Long id; @Column(name = .. 더보기
Spring Boot 에 JOOQ 설정하기. 새로운 스프링 프로젝트를 만들때, Spring Initalizr를 사용한다. Spring Initializr 는 인터넷이 연결된 상태에서만 설정이 가능하고, 기본적으로 https://start.spring.io 를 통해서 Service를 제공 받는다. Java Build Tool 인 Maven과 Gradle 둘 중에 하나를 선택하여서 프로젝트를 설정할 수 있다. JOOQ 는 Java Object Oriented Querying 의 준말로, 말그대로 Java 코드로 SQL을 작성할 수 있게 해주는 프로젝트다. 최근 런칭한 한 서비스에서 JPA와 JOOQ를 주 기술로 사용하였다고 한다. JOOQ는 JPA와 마찬가지로, DataBase에 상관없이 사용할 수 있다. 스프링 부트에서 JOOQ를 설정하는 것은 아주.. 더보기
마이바티스(MyBatis) 동적 쿼리 Java로 만들기. 스프링은 3.0 부터 Java Config를 지원하기 시작했고, 스프링 부트는 XML 설정 없이 동작 한다. (물론 여전히 XML 설정은 가능하다.) 마이바티스 또한, XML 설정 없이 Java 클래스만을 사용하여서, 동적 쿼리 생성이 가능하다. 스프링부트까지 사용하면 금상첨화다. 먼저, 회원 목록을 조회할 Controller를 작성하자. 화면에서, "/members" 요청이 들어오면, 회원 목록의 JSON 문자열을 반환하게 한다. Controller 의 요청을 받을 Service 클래스도 아래와 같이 작성한다. 이제부터 시작이다. Service 의 요청을 처리해 줄 Mapper 인터페이스를 만든다. (DAO로 혹은, Repository로 이름짓기도 한다.) @Mapper interface MemberM.. 더보기
마이바티스(MyBatis) Mapper XML 파일 빌드에 추가하기. 스프링 부트에서 마이바티스 XML로 설정하기. XML 파일로 매퍼를 설정했지만, 왠지 XML 매퍼도 JAVA 패키지 안에 넣고 싶다. (위의 프로젝트는, XML 파일이 resource 파일안에 있다.) 하지만, Maven 빌드를 할 경우, XML 파일은 빌드되지 않는다. 분명, MemberMapper.xml 파일이 존재하지만, 빌드 하면.. 아래와 같이 MemberMapper.xml 파일은 제외하고 빌드 된다. 이때는 Maven의 pom.xml 파일에 아래와 같이 설정을 추가하면 된다. 물론, 주의 깊게 봐야할 부분은.. includes 부분이다. 모든 폴더의 모든 xml 파일을 빌드에 추가하겠다는 설정이다. **/*.xml 설정을 추가하고, 다시 package 하면.. MemberMapper.xml 파.. 더보기
Spring Boot에 MyBatis 설정 하기. (2) 스프링 부트에 마이바티스 설정하기. 위 포스팅에서 스프링 부트에 마이바티스를 설정하는 방법을 알아봤다. 하지만 어노테이션에 쿼리를 작성해야한다는 점이 마음에 걸린다. 마이바티스로 작성하게 되는 쿼리가 한두줄로 가능한 쿼리도 아니고, 어노테이션으로 처리하기에는 부담이 크다. 물론, 아래와 같이 변수로 선언해서 사용할 수도 있다. 그리고 XML로 쿼리를 저장하는것도 당연히 가능하다. 먼저 마이바티스 매핑 XML을 저장할 폴더를 아래와 같이 추가한다. resource/mapper/MemberMapper.xml 여기서 눈여겨봐야할 것은 바로 namespace 값이다. namespace의 값은, MemberMapper.xml의 쿼리를 호출할 Mapper Class의 경로와 클래스명으로 하도록 해야한다. 이렇게 하.. 더보기
Spring Boot에 MyBatis 설정 하기. Spring Boot(http://projects.spring.io/spring-boot/)에 MyBatis(http://blog.mybatis.org/)를 설정하려면 어떻게 해야할까? 스프링(http://spring.io/)은 계속해서 발전하였고, 지루한 설정의 반복을 없애주는 스프링 부트도 이제 1.4버전이 출시되었다. 스프링 부트는 대부분의 최신 라이브러리를 모두 지원한다. 하지만, 유독 우리나라에서"만" 인기가 많은 MyBatis는 공식적으로 지원하지 않고 있다. 물론, 이제는 JPA를 사용해야한다는 목소리가 점점 커지고 있지만, 여전히 우리에게 가장 친숙한 ORM 프레임워크는 MyBatis이다. 스프링 부트의 자동 설정에 대해서 궁금하다면, 스프링 부트 코딩 공작소를 읽어보기를 추천한다. 다행히.. 더보기
SpringData 관련 오류. org.springframework.data.mapping.PropertyReferenceException ... Traversed path ... Spring Data JPA를 사용하면, QueryMethod를 사용할 수 있다. 위 오류는, 사용한 메서드명이 잘못되었을때 발생한다. 메소드명으로 올바른 쿼리를 추측할 수 있는지, 다시 한번 확인해 보자. 더보기