본문 바로가기

Back-End16

Spring Boot + Envers로 엔티티 이력관리하기 너무나 쉽고 편한 기능이라 쓸까말까 고민했었는데 한글화된 문서가 거의 없어서 일단 쓰기로 했습니다. 삽질보다는 공식 문서의 영문 해석능력에 따라 적용시간을 단축시킬 수 있습니다. 또, 스프링 캠프 2017에서 김영한님이 발표해 주신 자료영상을 찾아 보시면 이해하기 훨씬 수월하실 겁니다.개요Hibernate Envers 프로젝트는 각각의 대상 엔티티의 이력관리를 간편하게 도와줍니다. 정말 간단하게 적용하자면 @Audited어노테이션만 붙이면 끝납니다. 사실 Envers를 알기전까지 저는 제가 대상으로 하는 히스토리용 테이블을 따로 생성하여 json 형식으로 데이터를 저장하고 불러오곤 하였습니다. 뭐 상황에 따라 적용하는 방식의 이점이 있겠지만 Envers를 적용한다면 대상 테이블과 똑같은 테이블에 rev(.. 2017. 9. 6.
Spring Boot & OAuth2 기반 소셜 댓글 시스템 개발하기 회사에서의 잉여력 + 개인의 잉여력을 가지고 회사에도 도움 + 개인적인 공부에도 도움이 되는 프로젝트를 진행해 보고 싶었습니다. 제가 맡고 있는 서비스에 아쉬운점이 소셜 댓글이 없다는 것인데(ㅠ.ㅠ) 아쉬움도 달래고 공부도 하고 제 서비스에 댓글기능도 붙일겸 직접 소셜 인증(페이스북, 구글, 트위터, 카카오) & 간단한 댓글 Getting Started를 개발하기로 야심찬 계획(?)을 세웠습니다. 모든 소스는 github에 있습니다.개요목표는 페이스북, 구글, 트위터, 카카오 등 국내에서 많이 쓰이는 서비스들의 OAuth인증을 통한 댓글 시스템 구현하기! 여기서 트위터를 제외한 다른 인증은 모두 OAuth2를 사용합니다. Spring에는 이를 구현한 고마운 라이브러리인 Spring Social과 Spri.. 2017. 6. 24.
Gradle에 task 여러개 실행하도록 설정하기 기존에는 task를 grunt 하나만 돌리다가 이번에 webpack, grunt를 함꼐 쓰게 되면서 Gradle Build시 task를 순차적으로 모두 수행하도록 설정해 보았습니다.import org.apache.tools.ant.taskdefs.condition.Os task grunt(type:Exec) { workingDir "./" if (Os.isFamily(Os.FAMILY_WINDOWS)) { //on windows commandLine "cmd", "/c", "grunt" } else { //on linux commandLine "grunt" } } compileJava.dependsOn grunt기존에 1개만 처리되는 task는 위와 같은 방식입니다. 여기서 타입을 Exec으로 받아서 하.. 2017. 6. 9.
Parameter AOP 설정하기 간단 팁 보통 메소드단위의 AOP를 많이 사용하시는데 유저정보에 대한 값을 파라미터에서 AOP방식으로 캐치하여 User객체로 전환시키는 방법을 간단한 예제를 통해 알아보겠습니다.@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface User { }위의 예제소스를 보시면 User 어노테이션을 PARAMETER타입으로 선언하였습니다. 어노테이션의 매개변수가 필요하시다면 내부에 생성하시면 됩니다.@Controller public class Controller { @GetMapping(value = "/test") public String test(@User User user, HttpSession session) { ..... 2017. 6. 9.
토비의 스프링 | 6장. AOP4 - AOP란 무엇인가? 이제까지 UserService에 트랜잭션을 적용해 온 과정을 되짚어 보자.1. 트랜잭션 서비스 추상화트랜잭션 적용을 비즈니스 로직과 함께 넣었을 때 문제가 발생한다. 트랜잭션을 제외한 부분에서 수정작업이 있더라도 트랜잭션 적용 코드를 수정해야 하는 심각한 문제가 있었다. 그래서 인터페이스와 DI를 통해 무엇을 하는지를 남기고 분리하는 트랜잭션 추상화를 수행하였다. 트랜잭션 적용은 더 이상 비즈니스 로직 코드에는 영향을 주지 않고 독립적으로 변경할 수 있게 되었다.2. 프록시와 데코레이션 패턴여전히 비즈니스 로직에는 트랜잭션을 어디에 적용할지 경계설정을 담당하는 코드가 남아 있었다. 이를 제거하기 위해 DI를 이용한 데코레이터 패턴을 적용하였다. 클라이언트가 인터페이스와 DI를 통해 접근하도록 설계하고 데.. 2017. 5. 2.
토비의 스프링 | 6장. AOP3 - 프록시 팩토리빈과 포인트컷 프록시 팩토리 빈 방식의 장점/한계장점데코레이터 패턴과 같은 프록시를 도입하려고 했을 때 고민했던 문제점을 거의 완벽하게 해결해 준다.다이내믹 프록시를 이용하여 타깃 인터페이스를 구현하는 클래스를 일일이 만들지 않아도 된다.하나의 핸들러 메소드를 구현하여 부가기능 코드의 중복 문제를 해결한다.DI 설정만으로 다양한 타깃 오브젝트에 적용 가능하다.한계하나의 클래스 안에 여러개의 메소드 적용은 가능하지만 여러 개의 클래스에 공통적인 부가기능을 제공하는 일은 불가능하다.하나의 타깃에 여러 개의 부가기능을 적용하려 할 때도 문제이다.트랜잭션, 보안 기능, 기타 부가기능을 담은 프록시를 추가하려 해도 설정 코드는 그만큼 추가로 늘어나는 한계가 생긴다.TransactionHandler 오브젝트가 프록시 팩토리 빈 .. 2017. 4. 17.
토비의 스프링 | 6장. AOP2 - 다이내믹 프록시 6.3 다이내믹 프록시와 팩토리 빈우리는 트랜잭션 경계설정과 비즈니스 로직 코드를 분리하기 위해 전형적인 전략 패턴을 사용하였다.부가기능은 자신이 핵심기능을 가진 것처럼 꾸며서 클라이언트가 자신을 거쳐 핵심기능을 사용하도록 했다.그렇게 하기 위해 인터페이스를 통해 부가, 핵심기능을 접근도록 하였다.이렇게 마치 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것을 대리자, 대리인과 같은 역할을 한다고 하여 프록시(Proxy)라 부른다. 프록시를 통해 최종적으로 요청을 위임받아 처리하는 실제 오브젝트를 타깃(tartget) or 실체(real subject)라 부른다.프록시의 특징은 타깃과 같은 인터페이스를 구현했다는 것과 프록시가 타깃을 제어할 수 있는 것이다... 2017. 4. 7.
Freemarker Macro 이해하기 서버 템플릿 엔진으로 Freemarker를 많이 사용해 왔지만 궁금했던 함수들은 그때그때 Freemarker docs에서 확인해 보고 따로 정리는 하지 않았었습니다. 모든 것을 다 정리할 필요는 없을것 같고 그동안 해깔려했던 macro 함수를 간단한 예제를 통해 정리해 보았습니다. 모든 소스는 github에 있습니다.1. macro란?macro는 반복되는 구문에 대해 틀(템플릿)을 미리 지정해 놓고 호출하여 사용할 수 있게 해주는 함수입니다. 파라미터를 넣을수도 있고 nested, return 함수를 사용하여 유연하게 응용하여 사용할 수 있습니다. 또한, macro는 선언 위치에 상관없이 사용가능 합니다.(마치 자바스크립트의 호이스팅같은...) 기본 구조는 다음과 같습니다. ... ... ... Targ.. 2017. 4. 7.
토비의 스프링 | 6장. AOP AOP는 IOC/DI, 서비스 추상화와 더불어 스프링의 3대 기반기술의 하나이다. 이 장에서는 AOP의 등장배경, 도입 이유, 장점이 무엇인지 살펴본다.6.1 트랜잭션 코드의 분리비즈니스 로직과 트랜잭션 경계설정의 분리를 통해 성격이 다른 코드를 각각 독릭적인 코드로 만들 수 있다.public void upgradeLevels() throws Exception { TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition()); try { upgradeLevelsInternal(); this.transactionManager.commit(status); } catch (Exception .. 2017. 4. 5.