-

[스프링부트 및 JPA] - 주소변수 매핑, Http 요청을 file로 응답하기 본문

백엔드 기술 정리/스프링 부트

[스프링부트 및 JPA] - 주소변수 매핑, Http 요청을 file로 응답하기

흣차 2022. 1. 27. 01:49
728x90
반응형

Http에서 데이터를 요청할 때 2가지 방식으로 나눌 수 있습니다.

첫 번째로 쿼리스트링(querystring), 두 번째로 주소변수매핑(path variable)이 있습니다.

스프링부트에서는 주로 주소변수 매핑을 사용하고 있는데 서로 어떤 차이가 있는지 한 번 알아보겠습니다.

 

제가 떡볶이를 좋아하니까 떡볶이 집에 제가 배민으로 주문을 한다고 가정해봅시다.

뭐 먹을지 고민하다가 로제 떡볶이, 치즈 떡볶이 중에서 전 치즈 떡볶이를 시키려고 결정했다고 해봅시다.

이 때 제가 배민에서 떡볶이집 가게를 클릭해서 들어갈 때부터 한 번 살펴봅시다.

이런식으로 제가 떡볶이집 가게를 들어가서 이 가게에 대한 메뉴를 고르려고 할 때 저흰 가게에 대한 정보가 필요합니다.

이때 GET동작방식이 실행되어 가게의 정보를 확인할 수 있습니다.

근데 여러분들이 지금까지 웹 사이트 주소를 확인할 때 보셨을지 모르겠으나 주소 뒤에 ?type="떡볶이"

이런식으로 매핑되어있는 것을 혹시 보신적 있으신가요?

저는 어릴 때 이게 뭐지 왜 주소에 물음표가 있지 라고 생각했던 적이 있었는데 이것이 바로 쿼리스트링동작 방식에 해당한다는 것을 공부하면서 알게되었습니다.

즉, 구체적인 요청을 할 때 이 쿼리스트링이 필요한데요.

그렇다면 주소변수매핑은 어떻게 사용될까요?

주소변수 매핑은 어떤 요청 ~ /떡볶이/~~ 이런 구조를 띄고 있습니다.

당연히 Data를 응답할 것이기 때문에 RestController라고 입력하고 GetMapping을 다르게 설정해보았습니다.

이 때 주소창에 localhost:8080/dduck/?type=양념 이렇게 입력하면

이렇게 출력하게됩니다.

즉 파라미터에 값을 넣기만 하면 바로 출력할 수 있습니다.

하지만 주소창에 localhost:8080/dduck/양념 이렇게 입력하고 실행하면

이렇게 뜹니다.

자 어떤 것이 편리한가요?

가독성도 좋고 눈에 보기 쉬운건 쿼리스트링이 아닌 주소변수매핑이 훨씬 낫죠??

실제로 개발할 때 스프링부트에서는 주소변수매핑을 자주 쓴다고 하네요.

그러니까 @PathVariable이라는 어노테이션과 더불어서 꼭 까먹지말고 기억하시면 좋겠습니다.

@GetMapping의 주소에 매핑할 때도 {type}만 입력해주면 되니 이것도 같이요!

 

 

자 그럼 이어서 http요청을 file로 응답하는 것에 대해 알아보겠습니다.

지금 하는 이 과정들은 웹개발에서 정말로 중요하고 자주사용하는 것 위주로 포스팅하고 있으니 생략되는 과정이 있을 수 있습니다.

일단 우리가 해볼 것은

  • .txt파일 응답하기 (기본 경로는 resources/static)
  • 스프링부트가 지원하는 .mustache파일 응답하기
  • 스프링부트가 버린 .jsp파일 응답하기

총 3가지를 해보려고 합니다.

이 .jsp파일과 .mustache파일은 템플릿 엔진이 따로 필요합니다.

여기서 템플릿 엔진이란 html파일에 java코드를 쓸 수 있는 친구들을 의미하는데요.

근데 이 html에 자바코드를 넣는데 웹 브라우저가 이를 판독할 때 자바코드를 이해를 못하게 되어있습니다.

그래서 만약 html파일에 이런 자바코드를

int[] arr = new int[n];
for(int i = 0; i < n; i++) {
	arr[i] = scan.nextInt();
	System.out.println(arr[i]);
}

제 아무리 멋지게 작성해봐야 html이 제대로 이해를 못하고 이걸 그대로 출력시켜 버리면 상당히 큰일나겠죠?

내부의 로직이 외부에 유출되면 전혀 좋은 일이 안생깁니다.

그래서 이걸 어떻게 해야하냐면 index.html같은 html파일 대신에 index.jsp라고 만들어서 톰캣에 던져버립니다.

이 톰캣은 WAS(Web Application Service)라고 하는데 웹서버는 아파치라고 합니다.

이 .jsp파일을 WAS에 던진 뒤 톰캣이 자바코드를 해석해서 .HTML파일로 만들어 냅니다.

이 과정에서 출력된 자바코드가 응답되어 클라이언트로 넘겨줄 수 있게됩니다.

이 작업을 바로 템플릿엔진이 수행합니다.

그래서 .jsp와 .mustache 두개 다가 있는데 이것들을 배워놓으면 좋은 이유가 있습니다.

일단 .mustache는 스프링부트가 공식적으로 지원하는 템플릿 엔진이 있기 때문에 필요합니다.

하지만 .jsp는 스프링부트가 버렸지만, 현재 아직도 국내 대부분의 회사들이 .jsp파일을 사용하고 있기 때문에 배워두는 것이 아직까지는 필수적입니다.

실습을 해보겠습니다.

클래스를 새로 만들어서 @GetMapping으로 주소를 받아주고

a.txt파일을 return한다고 해봅시다.

저희는 파일을 리턴할 것이므로 @Controller어노테이션을 걸 것입니다.

그리고 어디로 가냐면

resources폴더에 static폴더에 a.txt라고 만듭니다.

그리고 This is a.txt라고 입력하고 결과를 살펴보면

이런식으로 파일의 내부를 읽어서 출력해줍니다.

이것이 정상적인 html파일을 Get방식으로 요청했을 때, 그리고 스프링부트가 a.txt파일을 따로 시키지 않았는데도 정상적으로 찾아서 출력해주는 모습을 확인할 수 있었습니다.

 

mustache파일 응답하기)

자 그럼 이제 스프링부트에서 공식 지원하는 mustache파일을 응답해보겠습니다.

그 전에 먼제 템플릿 엔진 라이브러리를 설치해봅시다.

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mustache

여기 들어가서 제일 최신버전의 걸로 들아간다음 

여기 이 코드를 복사합니다.

그리고 스프링부트의 pom.xml파일로 들어와서

복사한 것들을 dependencies 사이에 넣습니다.

그리고 ctrl + s를 통해 저장을 하면 자동으로 동기화합니다.

안전하게 쓰기 위해 껐다 킨 이후 static폴더로 갑시다.

src/main/resources내부의 static폴더에 b.html파일을 생성합니다.

그리고 f2를 눌러서 이 파일의 확장자를 .mustache로 바꾸고 h1태그로

이렇게 작성하고 컨트롤러로 가줍니다.

이렇게 입력하고 실행해봅시다.

자 그럼 어떤 일이 생기냐면

이런게 뜹니다.

확장자가 mustache이면 "어 내가모르는 파일인데" 라고 해서 브라우저가 해석을 못하고 파일을 다운을 받게해버립니다.

즉, 웹서버가 제대로 해석하게 하기 위해서는 이 파일을 static폴더가 아닌 template폴더로 옮겨야 합니다.

그리고

b.mustache였던 확장자를 지우고 b만 남겨놓고 다시 실행하면

이렇게 해석합니다.

자 그럼 어떻게 된건지 살펴보겠습니다.

mustache파일은 템플릿 엔진을 이용하여 실행할 수 있었습니다.

이 때 static폴더가 아닌 .mustache을 놔두면 따로 확장자를 입력안해도 파일명만 적어도 자동으로 찾아갈 수 있게합니다.

굉장히 편리하죠?

html파일이나 css파일은 정적인 파일이기 때문에 static폴더에 관리해놓고 쓸 수 있습니다.

하지만 mustache파일은 템플릿엔진으로 작동하기 때문에 templates폴더 안에 넣고 실행을 해야 했습니다.

이런식으로 동적인 파일과 정적인 파일을 구분하여 사용할 수 있게끔 스프링부트는 지원하고 있습니다.

자 마지막으로 JSP파일을 배워봅시다

 

JSP파일 응답하기)

https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper

이것도 템플릿 엔진이 필요하기 때문에 여기 들어가서 9.대 버전을 받아서 똑같이 pom.xml에 추가할 것입니다.

이렇게 톰캣-jasper을 넣고 서버를 재가동합니다.

근데 jsp파일은 스프링부트가 지원을 하지 않습니다. 

실제로 스프링부트를 시작할 때 tools에서도 mustache는 보이는데 jsp는 보이지 않습니다.

그래서 이친구는 mustache처럼 templates폴더가 디폴트 경로가 아니라 어디로 가냐면

여기가 기본 폴더가 됩니다.

이 views폴더안에 c.jsp라고 만들고

이렇게 컨트롤러에 만들고 실행해보면 

네 오류가 납니다. 

왜그렇냐면 yml파일을 설정하지 않아서 그런데요.

만약 apllication.properties라고 되어 있다면 확장자를 yml로 바꾸고 

이렇게 입력해주세요.

그러면 이렇게 실행이 됩니다.

yml파일의 prefix를 /WEB-INF/VIEWS라고 적고 suffix에 .jsp라고 작성하면

우리가 컨트롤러에서 return "c.jsp"라고 입력하지 않더라도 c만 적어도 실행을 가능하게 해줍니다.

 

스프링부트에서 기본적으로 .jsp파일을 템플릿엔진으로 지원하고 있지 않기 때문에 우리는 어쩔 수 없이 외부의 src폴더에 다른 폴더를 첨가하여 .jsp를 실행해야만 합니다.

이 때 우리가 yml파일에 prefix와 suffix를 설정함으로써 자동으로 .jsp를 웹서버가 읽을 수 있게 해줍니다.

이 역할을 바로 ViewResolver가 수행합니다.

mustache는 ViewResolver가 자동으로 탑재되어서 알아서 찾아주기 때문에 경로설정은 안해도 되지만 .jsp는 사용하기 위해선 이런 설정이 필요하다는 것! 

이렇게 짚고 넘어가시면 되겠습니다.

감사합니다.

728x90
반응형
Comments