01. 어노테이션 (annotation) 정리

    반응형

    ※ 자주 쓰이는 어노테이션

     

    @ModelAttribute

    - view에서 전달해주는 파라미터를 클래스(VO/DTO)의 멤버 변수로 binding 해주는 애노테이션

    바인딩 기준은 <input name="id" /> 처럼 어떤 태그의 name값이 해당 클래스의 멤버 변수명과 일치해야하고 set메서드명도 일치해야한다.

     

    ex)

    class Person{

    String id;

    public void setId(String id){ this.id = id;}

    }

     

     

    @RequestMapping

    - URL을 컨트롤러의 메서드와 매핑할 때 사용하는 스프링 프레임워크의 어노테이션이다.

    클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시하여 사용한다. URL외에도 HTTP 요청 메서드나 헤더값에 따라 매핑되도록 -0=옵션을 제공한다. 메서드 레벨에서 정의한 @RequestMapping은 타입 레벨에서 정의된 @RequestMapping의 옵션을 상속받는다.

     

    참고로, 메서드 내에서 viewName을 별도로 설정하지 않으면 @RequestMapping의 path로 설정한 URL이 그대로 viewName으로 설정된다.

     

     

    @Configuration

    - Configuration을 클래스에 적용하고 @Bean을 해당 클래스의 메소드에 적용하면 @Autowired로 빈을 부를 수 있다.

     

     

    @Resource

    - @Autowired와 마찬가지로 빈 객체를 주입해주는데 차이점은 Autowired는 타입으로, Resource는 이름으로 연결해준다.

     

    @Controller

    - spring MVC의 Controller 클래스 선언을 단순화시켜준다. 스프링 컨트롤러, 서블릿을 상속할 필요가 없으며,   @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다.

    Controller로 사용하고자 하는 클래스에 @Controller 어노테이션을 명시하면 component-scan으로 자동 등록된다.

     

     

    @Repository

    일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.

     


    ※ 그 외 어노테이션

     

    @ResponseBody

    - view가 아닌 JSON 형식의 값을 응답할 때 사용하는 애노테이션으로 문자열을 리턴하면 그 값을 http response header가 아닌 response body에 들어간다.

    만약 객체를 return하는 경우 JACKSON 라이브러리에 의해 문자열로 변환되어 전송된다.

    context에 설정된 resolver를 무시한다고 보면된다. (viewResolver)

     

     

    @RequestBody

    - 요청이 온 데이터(JSON이나 XML형식)를 바로 클래스나 model로 매핑하기 위한 애노테이션

     


    @RequestParam

    - @PathVariable과 비슷하다. request의 parameter에서 가져오는 것이다. 메소드의 파라미터에 사용됨

     

    단일 파라미터 변환

    private ModelAndView request_TEST(@RequestParam("test") int num,
    @RequestParam("test2") String str)){
            //위처럼 하나이상의 타입을 적용할수 있습니다. 스프링에서 지원하는 변환기에서 지원되는 모든타입을 변환가능합니다.
            //RequestParam은 하나이상 파라미터에서 사용가능합니다.
        }
    

    하지만 단점이 있다.

    위처럼 사용하게 된다면 만약에 넘어오는 requestParam중에

    @RequestParam 지정한 키값이 존재하지 않다면

    BadRequest로 http 4** 에러가 발생한다.

     

     

    2. 이를 방지하기 위하여 필수적이지 않도록 

    그리고 존재하지 않다면 DefaultValue를 지정할수 있다.

    private ModelAndView request_TEST(@RequestParam(value="test", required=false, defaultValue= "0") int num,
                                                       @RequestParam("test2") String str)){
            //required=false로 지정하면 해당 키값이 존재하지 않다고 해서 BadRequest가 발생하지 않게 됩니다.
                    //그리고 존재하지 않다면 num변수에 default로 0이 들어가게됩니다.
    }
    

     

     

    3. RequestParam을 map에 지정하여 사용하기.

    private ModelAndView request_TEST(@RequestParam HashMap<string,string> paramMap)){
            String data = paramMap.get("testParam");
        }
    </string,string>
    

     

    위의 예시처럼 map을 통해서도 파라미터를 컨트롤 할수 있습니다.

    대규모의 파라미터를 받는데 map을 사용하기엔 편하지만

    개발한 이외의 사람들이 유지보수하기에는 어려운 점이 있습니다.

    그래서 주로 "커맨드패턴"인 데이터커맨드를 만들서 사용하는데요.

     

    링크는 아래

    https://heavenly-appear.tistory.com/44

     

     

    @JsonProperty

    - Jackson 라이브러리를 참조하는 어노테이션이다.

    getter/setter 의 이름을 property 와 다른 이름을 사용할 수 있도록 설정한다. Database 를 자바 클래스로 매핑하는데 DB의 컬럼명이 알기 어려울 경우등에 유용하게 사용할 수 있다.

     

    다음과 같은 테이블이 있을 경우

    CREATE TABLE Users (
      u INT NOT NULL,
      a INT NOT NULL,
      e VARCHAR(80) NOT NULL
    );

     

    다음과 같이 JsonProperty 를 사용하면 DB 의 컬럼명을 변경하지 않아도 가독성을 높일 수 있다.

    public class User
    {
        @JsonProperty("userId");
        public Integer u;
      
        @JsonProperty("age");
        public Integer a;
      
        @JsonProperty("email");
        public String e;
    }

     

    json 으로 변환된 결과

    {
        "userId": 1,
        "age": 13,
        "email": "user@host.com"
    }

    이외에 @JsonIgnoreProperties, @JsonInclude 등이 있다.

     

    Jackson 라이브러리에 관한 자세한 내용:

    https://www.lesstif.com/pages/viewpage.action?pageId=24445183#JavaJsonlibraryjackson%EC%82%AC%EC%9A%A9%EB%B2%95-%EA%B0%9C%EC%9A%94

     

     

    @CrossOrigin

    - CORS 보안상의 문제로 브라우저에서 리소스를 현재 origin에서 다른 곳으로의 AJAX요청을 방지하는 것이다.

    @RequestMapping이 있는 곳에 사용하면 해당 요청은 타 도메인에서 온 ajax요청을 처리해준다.

    @CrossOrigin(origins = "http://jeong-pro.tistory.com", maxAge = 3600)

    -> 기본 도메인이 http://jeong-pro.tistory.com 인 곳에서 온 ajax요청만 받아주겠다.

     

     

    @CachePut

    - 캐시를 업데이트하기 위해서 메서드를 항상 실행하게 강제하는 애노테이션

    해당 애노테이션이 있으면 메서드호출을 항상한다. 그러므로 @Cacheable과 상충되어 같이 사용하면 안된다.

     

     

    @Lazy

    - 지연로딩을 지원한다.

     @Component나 @Bean 애노티에션과 같이 쓰는데 클래스가 로드될 때 스프링에서 바로 bean등록을 마치는 것이 아니 라 실제로 사용될 때 로딩이 이뤄지게 하는 방법이다.

     

     

    @Scheduled

    - 스프링 스케줄러이다. Unix의 cron처럼 특정시간 혹은 몇분 혹은 몇시간마다 동작하는 스케쥴러를 구현한다.

     

    ...더보기

    사용 예시)

     @Scheduled(fixedDelay=1000)
        public void TestScheduler(){
            System.out.println("스케줄링 테스트");
        }

    3가지 밸류가 존재한다.

    cron은 CronTab에서의 설정과 같이 cron="0/10 * * * * ?" 과 같은 설정이 가능하고

    fixedDelay은 이전에 실행된 Task의 종료시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.(밀리세컨드 단위)

    fixedRate은 이전에 실행된 Task의 시작시간으로 부터 정의된 시간만큼 지난 후 Task를 실행한다.(밀리세컨드 단위)

     

     

     

     

     

    반응형

    댓글