클래스를 선언할때 Lombok을 이용해 클래스를 선언하면 편리하게, 읽기 쉽게 코드를 짤 수 있다. 코드는 gradle의 Tasks->build->build를 누른 후 build파일에 생성되어 있다.
@RequiredArgsConstructor : final로 선언한 멤버 필드에 한해서 생성자가 자동으로 생성이 된다.
@application properties : 디폴트 설정을 이 에디터 창에서 바꿀 수 있다.
@AllArgsConstructor : 멤버 필드 모두를 매개변수로 하는 생성자를 자동으로 만든다.
@NoArgsConstructor : 기본 생성자를 매개변수가 있는 다른 생성자가 있더라도 자동으로
만들어준다.
@RequestMapping : 공통적인 url 경로를 지정한다.
@ResponseBody : viewName이 아니라 문자열을 반환토록 한다. JSON 또는 XML과 같은 다른 데이터 유형을 반환할 때도 유용하며, 클라이언트는 해당 데이터를 파싱하여 처리할 수 있다.
static 디렉토리 밑 html파일은 html파일명으로도 직접 접근하고(gradle에 thymeleaf로 가능) , templetes 밑 html파일은 url path로 입력해야 접근가능하다.
- MVC 패턴 : model은 데이터를 가지며 view는 ui에 대한 기능이 정의되어 있으며 Controller는 model의 데이터를 이용하여 view의 ui를 업데이트한다.
@GetMapping("/html/redirect")
public String htmlStatic(){
return "redirect:/hello.html";
}
302로 status code가 나오는데 리다이렉트 관련 번호이다
@GetMapping("/html/templates")
public String htmlTempletes(){
return "hello";
}
hello.html로 연결된다. templetes안에 있는 html 파일 컨트롤러 선언되어있는 클래스안에서 사용가능하다.
뷰네임이 컨트롤러를 통해 전달되고 모델데이터를 통해서 뷰리졸버가 뷰에 데이터를 반영해 ui에 데이터가 표시되게 한다.
@GetMapping("/html/dynamic")
public String htmlDynamic(Model model){
visitCount++;
model.addAttribute("visits",visitCount);
return "hello-visit";
}
브라우저가 스프링 서버를 통해 html을 전달하는게 주 목적이냐 하면 아니다. 데이터 베이스에서 받아온 데이터를 브라우저가 반영함 요청에 맞는 데이터만을 반영하는 것을 목표로함 요즘에는 최초 리퀘스트 정적 동적 html 반환 , ajax 비동기적으로 서버에 요청을 하고 뷰파일을 반영하는 것이 아니라 요청에 맞게 json을 반영함(서버에서 읽을 수 없다)
그렇기에 json형태로 생겼는데 String으로 반영함 (방법1)
자동으로 json 형태로 변환하는 방법
@ResponseBody
@GetMapping("/json/class")
public Star helloClassJson(){
return new Star("Robbie",95);
}
class로 반환하고 ResponseBody 어노테이션을 붙이면 스프링이 알아서 json 형식으로 브라우저에 반환한다.
Star정보를 읽은 다음 변수명을 키값으로 설정하고 value값은 변수에 담겨있는 값이 된다.
jackson library에서 처리한다. 직접 코드를 작성하지 않아도 된다. 변환을 할때 getter메소드를 사용함 object 래퍼를 사용할때 필요한 요구조건이 있음
json형태 문자열을 객체로 만들때(역직렬화) 기본생성자 그리고 setter나 getter가 필요하다. json형태로 문자열을 객체로 보낼때 브라우저에서 보내는 키값과 매칭이 되는 필드이름이 정확하게 일치해야 한다.
= @RestController : 컨트롤러 + ResponseBody임
뷰를 반환해야 하는 경우는 Controller만 하는 경우도 있고 필요하다면 개별적으로 ResponseBody를 설정하겠으나, 그렇지 않다면 RestController를 사용해서 json을 반환함
현업에서는 프론트엔드 팀에서 따로 html파일을 관리하는 서버를 만들고 운영하고, 백엔드는 api를 요청받고 json형태로 바꾸고 반환하는 서버를 만들 가능성이 높다.