Development/Java

[Spring] Annotation 관련

반응형

@Controller
// 일반적인 MVC Controller의 컨트롤러.. 이를 사용한 클래스는 객체를 자동으로 Wrapping 해주지 않는다.

@RestController
// 위의 Controller와 같은 역할을 하지만(Servlet Request, Response 핸들링), 
// Rest에 적합한 Controller로써, @RequestBody, @ResponseBody를 사용하지 않아도 알아서 Convert를 해서 핸들링한다.

@RequestBody
// Request로 받은 Input을 자동적으로 JSON으로 Wrapping해서 가져온다.

@ResponseBody
// Response로 나가는 output을 자동적으로 JSON으로 Wrapping해서 내보낸다.

// 아래는.. 게시판을 만들면서 사용했던 소스코드 중 하나이다.

@RestController
public class BoardRestController {

    @RequestMapping(value = "/board/changeName", method = RequestMethod.GET)
    public Callable changeAuthorName(String ip) {
        Author author = boardService.getAuthorByIp(ip);

        if (author != null) {
            if (author.getChangeCount() > 0) {
                author.setName(boardService.getRandomAlias());
                author.setChangeCount(author.getChangeCount() - 1);
                boardService.updateAuthorName(author);
            }
        }
        return () -> author;
    }
}

/*
보다시피, Return type이 Custom 타입이다. "Author" 라는 클래스를 정의하고 사용할 수 있는데,
받는 측에서는 해당 Author를 JSON으로 변환된 형태로 받게 된다.
이는 Spring에 지니고 있는 JacksonMessageConverter < 를 사용하여 객체를 JSON으로, JSON을 객체로 자동 Wrapping 해준다.
*/

// 예를 들어 아래와 같은 클래스가 있다고 치자
public class Student {
    private int id;
    private String name;
    private int age;
    private Date regDate; 
}

// 이는 아래의 코드에서

    @RequestMapping(value = "/student", method = RequestMethod.GET)
    public Student getStudent(){
        Student student = new Student();
        student.setId(1);
        student.setName("Gompang");
        student.setAge(20);
        student.setRegDate(new Date());

        return student;
    }

// 이렇게 사용하면 받는 측에서는 Student 라는 클래스가 JSON으로 Wrapping된 결과를 받을 수 있다.
{
	"id": 1,
	"name": "Gompang",
	"age": 20,
	"regDate": "Thu Mar 23 23:07:11 KST 2017"
}

// 이는 클라이언트(브라우저, AJAX) 와 Spring Controller 간의 데이터 포맷팅에 있어서 강력한 장점을 가져다 준다.
// 객체를 만들면, Wrapping을 자동으로 해주기 때문에 CustomType을 문제없이 사용할 수 있다.

// 반대로, 위의 객체를 JSON으로 RestController 혹은, 
// @RequestBody로 선언하여 Custom 객체로 받게되면, 해당 JSON이 JAVA의 POJO 타입으로 받을 수 있다.




반응형