[그린컴퓨터] Server/Spring

컨트롤러 2. { 프로젝트 계층, DTO와 Entity, 컨트롤러예제, 컨트롤러 리턴타입, 연습문제 }

Ben의 프로그램 2023. 8. 4. 09:33
728x90
프로젝트 계층
MVC 를 간단하게 이해하고 넘어가겠습니다. 
Model 단 : 서비스, 리파지토리, DB
View 단 : HTML
Control 단 : 컨트롤러

요청의 흐름을 아주 간단하게 보면 위와 같은데요. 요청의 흐름은 아래와 같습니다. 

 

 

DTO와 엔티티 객체의 역할
위에서 서비스는 가공과 교환의 역할을 수행한다. DTO와 ENTITY는 둘 다 데이터를 담는 클래스라서 헷갈릴 수 있는데, DTO 와 ENTITY는 아래와 같은 차이가 있다.

 

컨트롤러 예제
우선 Controller 패키지에 SampleController1 클래스를 생성합니다. 

클래스를 구성하기 전에 컨트롤러에서 사용하는 어노테이션을 우선 살펴볼텐데요.  

실제로 작성을 해볼 텐데, 메서드의 리턴 타입이 void 인데요. 리턴 타입으로 HTML을 내보낼 때 사용합니다. 이렇게 작성하면 외부에서 사용자가 ex1 메서드를 실행시키면 Mapping 애노테이션 때문에 자동으로 /return/ex1 HTML이 반환됩니다. 이번에는 return 이라는 폴더를 만들어서 작성해보겠습니다. 


위와 같이 ex1.html 을 작성한 다음 ex1 에 접속해보겠습니다.

return/ex1 으로 호출을 하면 ex1.html 이 반환된 것을 확인할 수 있습니다. 

 

컨트롤러 리턴타입
클라이언트에게 보내는 응답 데이터의 형태를 지정할 수도 있다. 응답 데이터의 형태를 지정하기 위해서는 메소드의 반환타입을 설정해야 한다.

ResponseEntity 를 사용하면 반환할 데이터 타입을 지정할 수 있다. 


[ String 반환 ]

화면에 무엇인가를 직접 출력할 때는 void 타입과 String 타입을 사용하면 됩니다. void 타입은 URL 경로를 그대로 HTML 파일의 이름으로 사용하고 String 은 HTML 파일 이름을 직접 지정하는 차이가 있습니다. 

String 타입을 반환하면서 반환 값으로 HTML을 지정한 것을 볼 수 있습니다. String 으로 명시를 해주면 내가 원하는 HTML을 반환시켜줄 수 있는 장점이 있습니다. 

ex2 로 접속을 해보니까 ex1 HTML 파일이 출력되는 것을 확인할 수 있습니다. 


[ 객체 반환 @ResponseBody ]

객체를 반환할 때는 JSON 타입으로 변환하여 내보내기 위해서 @ResponseBody 애노테이션을 함께 사용해주어야 한다. JSON을 사용하는 이유는 Java 클래스를 브라우저나 외부 프로그램에서는 인식하지 못하기 때문에 표준 데이터 형식인 JSON 혹은 XML을 사용하기 위해서입니다. 

BookDTO 클래스를 생성하였습니다. 

컨트롤러에 위와 같이 코드를 추가하였습니다. 객체를 반환하기 위해서는 @ResponseBody 애노테이션을 사용하고 있는 것을 확인할 수 있습니다. 객체를 반환할 때 사용한 @ResponseBody 애노테이션이 사용하는 라이브러리는 jackson 입니다. 

브라우저를 통해서 호출을 해보았습니다. 키-value 쌍 형식으로 객체가 JSON으로 표현된 것을 볼 수 있습니다. [ ] 대괄호로 리스트가 JSON으로 표현된 것을 볼 수 있습니다. 


응답 형태도 HTML이 아니라 json 인 것을 확인할 수 있습니다. 

 

ResponseEntity (응답코드반환하기)
ResponseEntity 클래스를 활용하여 에러코드와 메시지를 같이 전달할 수도 있다. ResponseEntity 는 응답코드, 헤더, 본문데이터를 자유롭게 설정할 때 사용하며 사용자 요청 처리를 실패한 상황에서 주로 사용합니다. 

응답 코드만 보낼 때는 ResponseEntity 의 제네릭 타입이 생략된 것을 볼 수 있고, ResponseEntity 의 제네릭형은 반환하는 ResponseEntity 의 첫 번째 인자의 자료형을 사용하는 것을 볼 수 있다. OK 말고 서버에러를 내보내고 싶을 때는 HttpStatus.INTERNAL_SERVER_ERROR를 사용하면 됩니다. 

코드를 위와 같이 ex5 를 수정하였습니다. 이제 한번 실행시켜보겠습니다. 

ex5 를 실행시켜보면 에러가 반환되는 것을 확인할 수 있습니다. 

ex6 을 출력한 화면입니다. 

ex7 을 출력한 화면입니다. 

 

연습문제
q1 은 중간 경로와 마지막 경로가 지금 작성중인 q1( )과 같기 때문에 void 만 해주어도 정상 실행 됩니다. (단 return / q1.html 이라는 파일이 존재해야 합니다!)
=========================1번과 2번 문제 코드와 출력 화면 입니다. =========================


jackson 이라는 라이브러리가 json 으로 값을 정리해서 보내주고 있는 것을 볼 수 있습니다. 

================연습문제 3번과 4번(객체 반환) 코드와 출력 화면입니다. =======================

이 문제에서 눈여겨 봐야 하는 점은 JSON이 객체와 리스트를 표현하는 방식입니다. 중괄호 대괄호 컴마를 이용해서 표현하고 있는 것을 볼 수 있습니다. 

==================문제 5번 객체를 담은 리스트 반환하는 코드와 출력 화면입니다. =================



Response 메시지라는 것은 원래 컨트롤러가 응답을 받은 뒤 응답할 때 자동으로 생성해서 전달하는데요. 개발자가 위에서 보는 것처럼 RespnoseEntity 객체를 활용하여 임의로 응답코드를 지정해줄 수도 있습니다. ResponseEntity 를 사용할 때는 2가지 방법이 있는데요. 첫 번째, 

===ResponseEntity 를 이용하여 메시지 & 객체와 HttpStatus 코드를 반환하는 6번 7번 문제를 풀어보았습니다.====