스프링에서 Filter, Interceptor, AOP는 모두 어떤 동작 이전/이후에 추가적으로 처리해주어야 할때 사용한다.

기능적으로는 비슷한데 내부 구현적으로는 차이가 있다.

 

Filter, Interceptor : Sevlet 단위에서 실행

AOP : 메소드 앞에 proxy 패턴의 형태로 실행

 

그래서 실행 순서도 차이가 있다 ???

 

Filter -> Interceptor -> AOP -> Interceptor -> Filter 순이다

이미지 참조 : blog.naver.com/platinasnow/220035316135

 

Request -> Servlet Filter -> Dispatcher Servlet -> HandlerInterceptor -> Controller

 

1. 서버를 기동시켜 서블릿이 올라오는 동안 init 실행 되고 FilterdoFilter 실행

2. 컨트롤러 이전에 InterceptorpreHandler실행

3. 컨트롤러 빠져나온다음 InterceptorpostHandler, afterCompletion 실행

4. FilterdoFilter 진행

5. 서블릿 종료시 destroy 실행

 

AOP는 주로 비지니스 로직단에서 로깅,트랜잭션, 공통예외처리 에서사용한다.

 

 

참고

hayunstudy.tistory.com/53

 

# Filter , Interceptor , AOP 사용목적 정리

Filter,Interceptor,AOP 모두 요청 중간에 가로채서 사전처리,사후처리를 하는 의미는 비슷하다. 로깅처리 또한 셋다 가능. 차이점이라고 하면 , 1. 셋의 시점이 다르다는것 : Filter -> Interceptor -> AOP 2. 적

hayunstudy.tistory.com

junshock5.tistory.com/142

 

Filter, Intercepter, AOP 차이점

[ 배경 ] 자바 웹 개발을 하다 보면, 공통적으로 처리해야 할 업무가 생깁니다. 예를 들어 로그인 관련 세션 처리, 사용자 권한 체크, XSS(Cross Site Script) 방어 로직, PC Mobile 플랫폼 분기 처리, 로그

junshock5.tistory.com

 

1. RestTemplate이란?

Spring 3.0부터 지원하며 스프링에서 http 통신에 유용하게 쓸수 있도록 제공해주는 템플릿이다.

즉, API 통신해서 가져 올수 있도록 도와준다.

 

2. 예시코드

@GetMapping("/test")
    public ResponseEntity<List> testList(testVo testVo) {
        String url = "http://testurl.com"; // api url
      

  //get parameter 담아주기
        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
                .queryParam("test1", testVo.getUserId())
                .queryParam("test2", testVo.getValue());
       HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectTimeout(30000); // 연결시간 초과
        //Rest template setting
        RestTemplate restTpl = new RestTemplate(httpRequestFactory);
        HttpHeaders headers  = new HttpHeaders(); // 담아줄 header
        HttpEntity entity = new HttpEntity<>(headers); // http entity에 header 담아줌

        ResponseEntity<JSONArray>  responseEntity = restTpl.exchange(url, HttpMethod.GET, entity, JSONArray.class);
        L.info("responseEntity.getBody()" + responseEntity.getBody());
        List result = (List) responseEntity.getBody();

        return ResponseEntity.ok(result);
    }

 

3. 설명

HttpComponentsClientHttpRequestFactory :  RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.

 

RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
이렇게 써도 가능하나 다양한 설정을 추가하지 못한다.

 

POST 방법으로 하고 싶으면 HttpEntity를 선언할때 body부 를 넣어주면된다.

String body =~~; // 보통 map형식

HttpEntity entity = new HttpEntity(body,headers);

 

그리고 여기서는 return을 List로 받고싶어서 JSONArray를 썼는데, 

List<Object> 형태가 아닌 다양한 JSon 형태라면 JSONObject로 리턴받아 해당 값을 get해도 된다.

ResponseEntity<JSONObject>  responseEntity = restTpl.exchange(url, HttpMethod.GET, entity, JSONObject.class); 

responseEntity.getBody().get("example");

4. 참조 문서

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

 

RestTemplate (Spring Framework 5.1.7.RELEASE API)

Synchronous client to perform HTTP requests, exposing a simple, template method API over underlying HTTP client libraries such as the JDK HttpURLConnection, Apache HttpComponents, and others. The RestTemplate offers templates for common scenarios by HTTP m

docs.spring.io

해당 페이지에 Get, Post등 다양한 방법이 나와있다. 

나는 여기서 exchange 방법을 썼는데 HTTPMETHOD.GET / POST로 바꿔서 쓰면된다.

JPA(Java Persistent API)


 JPA는 여러 ORM 전문가가 참여한 EJB 3.0 스펙 작업에서 기존 EJB ORM이던 Entity Bean을 JPA라고 바꾸고 JavaSE, JavaEE를 위한 영속성(persistence) 관리와 ORM을 위한 표준 기술이다. JPA는 ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스가 바로 JPA이다.

  ORM(Object Relational Mapping)이란 RDB 테이블을 객체지향적으로 사용하기 위한 기술이다. RDB 테이블은 객체지향적 특징(상속, 다형성, 레퍼런스, 오브젝트 등)이 없고 자바와 같은 언어로 접근하기 쉽지 않다. 때문에 ORM을 사용해 오브젝트와 RDB 사이에 존재하는 개념과 접근을 객체지향적으로 다루기 위한 기술이다.


따로 쿼리 없이 vo와 db를 연결해준다.








CRUDRepository를 extends 하는것만으로도

기본적인 CRUD는 모두 제공한다.


따라서 추가적으로 구현할 것은 없다.

다만 SQL이 필요 할때만 @Query로 annotation을 추가하여

쿼리를 추가해주면 된다.


Query를 추가하는 방식은 두가지가 있는데

1. db query

2.vo  클래스에 관해서 쿼리를 날리는 방법



+ Recent posts