Spring/Spring Boot

[Spring] Controller에서 html page return rendering 하기 (@RestController VS @Controller)

민돌v 2021. 11. 23. 12:56
728x90

Spring에서 index 페이지는 resource/static 에 있으면 자동으로 home 화면으로 렌더링이 된다.

그러면 다른페이지로 이동하기위해서는 어떻게 해야할 까??

 

아 나는 인텔리제이를 사용한다.

 

오늘은 이거에 대해 기록을 남겨보자


 

1. Controller

 

나는 Spring 의 구조를 Controller - Service - repoistory로 나누었다.

Controller에서 clinet에 대한 모든 요청과 응답을 처리한다.

 

SSR(ServerSideRenderning) 을 쓰지않고 CSR(Client Server Rendering)로 구현하기 위해서, 모든 요청과 응답을 JSON으로 처리하고자 한다.

 


 

2. 타임리프

S3 front를 배포하지 않은 로컬에서 html 파일을 렌더링 하기위해서 타임리프를 사용한다.

 

타임리프란, 스피링에서 제공해주는 템플릿 엔진이다.

 

build.gralde에 아래의 코드를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

 


 

3. Controller 코드

 

타임리프를 사용하면 static 폴더 안에, 매핑되는 html 파일을 찾아 렌더링 해준다.

배포를 했을 떄는, 타임리프 대신 url로 바로 매핑해주면 되지 않을까...?

@Controller
@RequiredArgsConstructor
public class Frontcontroller {
    @GetMapping("/view")
    public String getViewpage(){

        return "view";
//        return "redirect:https://www.Cloudfronturl.com/";
    }
}

 


 

4. @RestController Vs @Controller

 

Spring의 Controller 어노테이션에서는 @RestController 와 @Controller 2가지 어노테이션이 있다,

위와같은 방법은 @RestController 에서는 작도하지않고,

@Controller 에서만 작동한다, 그 이유가 뭘까?

 


 

@Controller와 @RestController의 차이


@Controller는 주로  Web페이제의 컨트롤러에서 사용된다.

Web 페이지용 컨트롤러는 JSP나 템플릿 엔진 View로 전환 응답의 HTML을 생성하기 때문에 기본적으로 메소드의 반환 값은 View 전환 대상을 지정하는 데 사용한다.

 

@RestController는 Json이나 XML 등을 반환 WebAPI 용 컨트롤러로 사용한다.
이것은 View로 전환하지 않기 때문에 메소드의 반환 값은 응답(response)의 내용(content)이 된다.

@RestController는 @Controller에서 @ResponseBody를 붙힌걸 축약한거나 다름이 없다.

   @RequestMapping("/text1")
    @ResponseBody
    public String text1() {
        return "text content";
    }

 

따라서 RestController를 사용했을 때는 그 응답이 ResponseBody에 담기기 때문에, View 템플릿으로 렌더링할 수 없는 것 같다.

 

 

 

끝!

 

 

참고

github : https://github.com/thalals/Sparta_TimeAtack_Test/tree/main/week8_spring/src/main/java/com/example/week8_spring/controller

Controller Vs RestController http://www.devkuma.com/books/pages/475

반응형