인프런 커뮤니티 질문&답변

맹수호빵님의 프로필 이미지

작성한 질문수

포트폴리오 초간단 배포하기

백엔드와 프론트엔드가 따로 있는 프로젝트 배포하기

타임리프 + html + RestController를 쓰는 경우 질문 드립니다!

해결된 질문

24.02.13 14:37 작성

·

406

·

수정됨

1

안녕하세요 강사님.

강사님 프론트엔드 강의도 보았고 현재 이 강의를 보며 진행중인 프로젝트 배포 단계에 있습니다!

 

여기서 몇가지 고민이 있는데,

타임리프 등을 사용해서 서버에서 페이지를 만들어서 주는게 SSR 렌더링 방식으로 알고 있습니다! 그 반대인 CSR은 빈 페이지를 넘겨주고 클라이언트의 요청에 따라 값이 바뀌는 것이라고 학습했습니다.

 

현재 제 프로젝트는 스프링부트 + HTML + Ajax + RestController 를 이용해서 CSR 렌더링을 목표로 진행을 했는데요.

(리액트나 뷰등은 학습 리소스등의 이유로 바닐라JS 를 사요했습니다.)

그 과정에서 사용자가 접속하는 URL과 html을 어떻게 매핑해주지 고민하다, SSR 방식에서 많이 쓰는 타임리프를 사용하여 주소 경로와 html 페이지를 매핑 시켜주는 걸 이용해서 진행했습니다.

@Controller
public class ViewController {

	@GetMapping("/")
	public String home() {
		return "home";
	}

	@GetMapping("/kakao")
	public String login() {
		return "kakao";
	}

	@GetMapping("/join")
	public String join() {
		return "member/joinForm";
	}

	@GetMapping("/add")
	public String addArticle(@RequestParam(name = "type") String articleType, Model model) {
		model.addAttribute("articleType", articleType);
		return "article/addArticle";
	}
}

이런식으로 Controller를 만들어 타임리프 기본 경로(templates 패키지)를 이용하여 그 곳에 html 파일을 넣어주고 html 파일과 경로를 매핑 시켜주는 용도로만 사용을 했습니다.

 

이러고 강사님의 배포 강의를 보니 약간 제가 짠 방식은 SSR과 CSR이 짬뽕(?)된 느낌을 받았습니다. 아무래도 타임리프를 경로와 html을 매핑해주는 용도로만 사용하더라도 타임리프를 사용하고 있어서 그런 느낌을 받고 있는 것 같습니다.

 

강의에 나온 방식으로 바꿔서 프론트,백을 따로 배포 해보려고 하니 강의 내용에서 웹상 URL이 저희가 일반적으로 사용하는 경로가 아닌 .html 파일로 주소가 설정이 되는것으로 확인했습니다.

만약 제 코드에서 타임리프를 사용하는 ViewController를 없애고 진행을 한다면 사용자가 실제 사용하는 URL을 html 파일명이 아닌 일반적인 URL로 사용할 수 있을까요? (쿼리 스트링, 패스 파라미터등도 고려하여..)

 

nginx를 사용하면 힌트가 될 것 같다는 느낌을 받았습니다.

아니면 현재 제가 진행한 방식처럼 타임리프를 유지한 채 프론트,백엔드를 따로 배포해도 문제가 없을지..

결국 제가 원하는 방식은 깔끔하게 백/프론트를 분리하여 배포 하는 것인데 강의에서 .html 파일명으로 주소 경로가 지정되는 것을 보고 고민이 되어서 강사님 의견도 궁금하여 질문 남깁니다!

답변 1

0

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

2024. 02. 15. 04:57

맹수호빵님 안녕하세요~

우선 좋은 질문 남겨주셔서 감사합니다. ㅎㅎ

 

아무튼 요점은 .html 형태의 확장자가 붙지 않게 path를 구성하고 싶은거겠죠?!

지금 사용하고 있는 방식도 충분히 가능하고, 백엔드/프론트엔드를 나눠서 구성하고 싶다면 당연히 그것도 가능합니다.

 

nginx를 사용하면 힌트가 될 것 같다는 느낌을 받았습니다.

-> (이미 알고 질문하신거 아닌가요 ㅋ..) 말씀하신대로 nginx를 이용하면 백엔드/프론트엔드를 나눠서 구성하려고하면 지금 방식이 아니라 nginx를 활용해볼 수 있을 것 같은데요, nginx에서 forwarding을 해줄 때 클라이언트는 일반적인 path로 요청을 하도록 하고, 내부에서는 .html을 붙여서 백엔드 API로 붙도록 하면 됩니다. 다만 이렇게 했을 때 주의해야할 점은 nginx로 들어오는 요청에 대해 view에 해당하는 HTML 요청API 요청path에 대한 prefix 같은 것으로 구분해줘야합니다. 이렇게 안해주면 모든 요청이 .html이 붙을거고, 이런 요청은 API가 받기에 부적절하겠죠. 따라서 아래와 같이 구분해 볼 수 있을 것 같습니다.

 

  • (view, .html 붙임) /home -> /home.html

  • (view, .html 붙임) /kakao -> /kakao.html

  • (api, /api는 제외하고 포워딩하고, html 붙이지 않음) /api/some-function -> /some-function

 

아니면 반대로 view에 해당하는 요청들을 prefix를 추가하는 것도 가능 하겠네요.

 

  • (view, /view는 제외하고 포워딩하고, html 붙임) /view/home -> /home.html

  • (view, /view는 제외하고 포워딩하고, html 붙임) /view/kakao -> /kakao.html

  • (api, 아무것도 안하고 포워딩만) /some-function -> /some-function

 

혹은 두 방법 모두 적용해서 view도 prefix를 붙이고 api도 prefix를 붙이는 것도 가능할 것 같습니다. 이건 예시를 안드려도 아시겠죠?

그리고 nginx에서 어떻게 해야 이렇게 포워딩 할 수 있는지는 chatgpt한테 물어봐도 알려줄 것 같습니다.

 

궁금하신 내용이 해결 됐을까요?!

또 궁금한 내용 있으면 질문 남겨주세요.

감사합니다.

맹수호빵님의 프로필 이미지
맹수호빵
질문자

2024. 02. 17. 15:30

자세한 설명 감사드립니다!