Spring Framework 11

RestTemplate POST 요청 시 유의할 점. (RequestBody HashMap 사용)

스프링에서 제공하는 RestTemplate 을 이용하여 Post 요청을 하려면, RestTemplate template = new RestTemplate(); return template.postForObject("http://111.222.333.444/api/test/", map, Map.class);위와 같은 형태로 하면 된다. 위의 경우는 Same Policy Origin 때문에 CORS 를 해야하는 상황에서 Proxy 를 둔 상황이다. 아무튼, 위와 같이 Post 요청을 할 때 requestBody 를 인자로 전달해야하는데 이 requestBody 가 postForObject의 두번째 인자이고, Object 타입이다. 위 예에선 두번째 인자로 보낸 map이다. requestBody 를 map으로..

Data Access 기술 선정

정상혁님이 쓰신 글 Java에서 XML없이 SQL개발하기 을 보고 Mybatis 를 버려야겠다는 생각을 했다. 정상혁님의 글 내용중에도 있지만, 현재 Mybatis 를 썼을 때 발생하는 장점이 많이 퇴색했다. Mybatis 는 조인된 결과를 담는 ResultMap 과 내부에서 쓰는 Association 같은 것을이 너무 불편했고, 쿼리에선 값이 정상적으로 조회되는데 Mybatis 결과가 객체에 정상적으로 셋팅되지 않을때, 이유를 알기 어렵고, 쿼리 결과를 개발자가 직접 핸들링 하기가 힘들다. 또한 Mybatis 에서 제공되는 기법들은 Spring JDBC에서도 모두 제공되고 있다. 그런데, 국내에서는 Mybatis 가 거의 관례처럼 돼버렸다. 요즘은 그래도 김영한 ORM 전도사님께서 국내최초로 ORM 책..

Spring Boot - Simplifying Spring for Everyone

SpringSource 에서 Spring Boot 라는 신규 프로젝트가 릴리즈 되었다. 이게 뭔가.. 하고 살펴 보니 기존에 스프링 프레임웍 으로 프로젝트를 셋팅 하려면 프로젝트 환경설정용 xml 이나 Java 파일을 작성하고, WAS 를 설치하고 WEB.XML 을 설정하고 , 컨트롤러-서비스-DAO-DOMAIN 을 만들어서 기본 셋팅을 했다. (물론 TEMPLATE PROJECT로 해도된다) 헌데, 이 Spring Boot 프로젝트는 위 과정들을 죄다 생략 해준다.. Spring Boot SLI 라는 커맨드라인용 툴을 다운 받으면 매우 간편하게 일련의 작업들을 자동화할 수 있다. 각설하고, 간단한 예제를 보자.. 스프링 블로그에 Spring-Boot 소식이 올라왔다. 자세한 내용은 링크를 참조하여 보시..

추상화, DI

스프링의 3대 핵심 기술 중 "추상화" 라는 것이 있다.. 갑자기 누군가 나에게 추상화에 대해 설명해 보라.. 라고 질문을 한다면 뭐라고 답을 해야할까? 라고 생각을 해보았다. 생각을 해보니, 추상화라는 것은 결국 DI 일 뿐이였다. 예를 하나 들어볼까.. 뭐가 좋을까.. OXM 추상화 를 예로 들어보자 .. 스프링은 OXM 추상화를 제공한다. oxm 기술에는 비슷비슷한 여러가지가 있는데, Castor , JaxB, Xstream 등이 있다. 스프링에선 위 기술들에 대한 추상화 인터페이스로 Unmarshaller 를 제공한다. 그리고 각 기술에 대한 구현체들도 제공한다. 당연히 추상화 인터페이스인 Unmarshaller 를 구현하고 있다. 하여, 개발자는 어떤 OXM 기술을 쓰던 Unmarshaller ..

DI - strategy pattern, decorator pattern, proxy pattern & AOP

DI 의 끝을 모르겠다 ... DI (Dependency Injection) 는 STRATEGY PATTERN(전략 패턴) 이다.. 스프링 프레임워크의 모든 것의 중심엔 언제나 DI가 있다. DI는 확장 포인트 임과 동시에 DI에 또 다른 패턴을 적용함으로써 동적으로 특정 행동을 추가할 수 도 있고, 변경할 수도 있다. 데코레이터 패턴을 잠깐 생각해보자.. InputStream is = new BufferedReaderInputStream(new FileInputStream()); 이는 일종의 생성자를 이용한 DI라고 이해하면 된다. 생성자를 이용한 DI를 통해 특정 기능을 동적으로 추가해주고 있는 것이다. 프록시 를 살펴보자. class HelloProxy{ Hello hello; public void..

토비의 스프링 느낀점 - 스프링프레임워크 철학에 대해.

토비의 스프링 을 3독째 정독하면서 내가 느낀 점을 간단히 작성한다.. 우선, 이 리뷰는 스프링프레임워크의 기능보다, 개발 철학에 중점을 둔 리뷰임을 밝힌다. 토비의 스프링은 읽으면 읽을수록, 감탄을 자아내게 하는 책이다.. 우선 저자인 이일민 님은 스프링에 대한 깊은 이해 뿐만 아니라, 객체지향적 설계, 테스트주도개발, 리팩토링 뿐만 아니라, 애자일, eXtreme Programming 에도 조예가 깊은 분임을 느낄수 있었다. 책 전반에 걸쳐 객체지향적 설계, 리팩토링, 테스트주도개발 의 중요성에 대해 꾸준히 강조하고 있다. 또한 이 책에는 애자일, eXtreme Programming 개발 방법론에 대해서도 나온다. 딱 애자일, eXtreme Programming 이라고 명시 돼 있진 않지만, 이책의 ..

@Cacheable, @CacheEvict

빈번하게 호출돼서 화면에 출력돼야 하는 데이터는 Caching 을 이용하면, 속도가 훨씬 빨라진다.. 아주 간단히 말해, 매번 똑같은 데이터를 굳이 새롭게 호출해야 할 필요 없이 특정 영역에 저장해뒀다가 바로 꺼내쓰는 것이 바로 Caching이다. 스프링에선 역시 Caching을 아주 멋들어지 제공한다. 캐싱 기능을 적용하고 싶은 메소드에 @Cacheable 에노테이션만 붙여주면 이 메소드는 캐싱기능이 적용된다.. @Cacheable 은 여러모로 @Transactional 과 흡사하다.. Manager를 등록해야하는것 마저 동일하다 @Transactional 이 transactionManager를 등록해야하는것과 마찬가지로 @Cacheable 은 cacheManager를 등록해야한다.. @Cacheabl..

Controller return type void 인 경우,

단순히 model 에 addAttribute 만 하고, jsp 에서 model attribute 를 출력해주고픈 마음에 @RequestMapping(value="/myMethod") public void myMethod(Model model){ model.addAttribute("message", "attribute added"); } 위와 같이 선언을 하면 과연 model에 attribute 만 추가되고 끝일까? 답은 아니오 다. 왜냐하면 스프링에서 자동등록되는 전략 중 RequestToViewNameResolver 를 통해 자동생성되는 뷰 이름이 사용된다.

Spring 3.2 MockMvc

오늘 Spring 3.2의 MockMvc 를 살펴봤는데, 진짜 너무 너무 멋지다 훌륭하다.. 컨트롤러 테스트는 이제 정말 편하게 할 수 있을 듯 하다. junit testcase : /** * */ package me.kwo2002.mvctemplate; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.m..

프록시를 만들기가 번거로운 이유는 무엇일까?

1. 타깃의 인터페이스를 구현하고 위임하는 코드를 작성하기가 번거롭다는 점이다. 부가기능이 필요없는 메소드도 구현해서 타깃으로 위임하는 코드를 일일이 만들어줘야한다. 복잡하진 않지만 인터페이스의 메소드가 많아지고 다양해지면 상당히 부담스러운 작업이 될 것이다. 또, 타깃 인터페이스의 메소드가 추가되거나 변경될 때마다 함께 수정해줘야 한다는 부담도 있다. 2. 부가기능 코드가 중복될 가능성이 많다는 점이다. 트랜잭션은 DB를 사용하는 대부분의 로직에 적용될 필요가 있다. 아직까지 add()메소드에는 트랜잭션 부가기능을 적용하지 않았지만, 사용자를 추가하는 과정에서 다른 작업이 함께 진행돼야 한다면 add() 메소드에도 트랜잭션 경계설정 부가기능이 적용돼야 한다. 메소드가 많아지고 트랜잭션 적용의 비율이 높..