728x90
목차
1. Controller
■ BasicController
- @RestController은 응답인터페이스에서 무조건 데이터를 리턴하고 view로 리턴 불가능
- @Controller는 view를 리턴하고, 응답인터페이스에 @Responsebody를 쓰면 데이터를 리턴
- @RequestMapping을 사용하다가 spring 4.3이후에는 @GetMapping(uri)형식으로 사용 가능
- 대표적으로 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping을 사용
- 자료형이 String일 때만 text로 응답하고 나머지는 JSON으로 응답
package com.web.study.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.web.study.dto.DataResponseDto;
import com.web.study.dto.ErrorResponseDto;
import com.web.study.dto.ResponseDto;
//@Controller
@RestController
public class BasicController {
// 응답 인터페이스
// 고정된 형식에 내용만 바꿔서 보냄
// @RequestMapping(value = "/view/test", method = RequestMethod.GET)
// @ResponseBody
@GetMapping("/view/test")
public ResponseEntity<? extends ResponseDto> view() {
List<String> strList = new ArrayList<>();
strList.add("a");
strList.add("b");
strList.add("c");
strList.add("d");
strList.add("e");
if (strList.contains("e")) {
try {
throw new RuntimeException("오류");
} catch (Exception e) {
return ResponseEntity.badRequest().body(ErrorResponseDto.of(HttpStatus.INTERNAL_SERVER_ERROR, e));
}
}
return ResponseEntity.ok().body(DataResponseDto.of(strList));
}
}
// String일 때만 text로 응답이 오고 나머지는 JSON으로 응답이 옴
// RestController는 무조건 데이터를 리턴, view로 리턴하는 방법 없음
// Controller는 view를 리턴, ResponseBody를 쓰면 RestController와 같이 데이터를 리턴
- Response
■ HelloController
- 매개변수로 요청한 값을 받아올 수 있음
- name에 "이"를 요청하여 코드 처리 후 JSON으로 응답
package com.web.study.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
// 요청과 응답을 받을 수 있는 컨트롤러로 변경해줌
@RestController
public class HelloController {
// get요청
@GetMapping("/hello")
public Map<String, String> hello(String name) {
Map<String, String> testMap = new HashMap<>();
testMap.put("name", name);
testMap.put("age", "32");
testMap.put("address", "부산 부산진구 부전동");
return testMap;
}
}
- Request
- Response
■ BasicRestController
- 일반적인 Param사용은 @RequestParam에 key값을 넣고 매개변수를 넣어 사용
- key값과 같은 매개변수명을 사용하여 요청값을 가져오는 것이 가능
- Mapping의 uri에 {id}는 @PathVariable을 사용하여 매개변수로 받는 id에 적용 가능
package com.web.study.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.web.study.dto.DataResponseDto;
import com.web.study.dto.ResponseDto;
import com.web.study.dto.request.BasicTestDto;
import lombok.Data;
@RestController
public class BasicRestController {
// GET 요청의 param을 처리하는 방법
// GET, POST만 가능
// key값을 매개변수명과 일치시켜 사용 가능
@GetMapping("/read")
public ResponseEntity<? extends ResponseDto> read(BasicTestDto basicTestDto){
String userInfo = basicTestDto.getName() + "(" + basicTestDto.getAge() + ")";
return ResponseEntity.ok().body(DataResponseDto.of(userInfo));
}
// 위 방식의 원래 방식이지만 위의 방법이 더 간단한 방법이며 같은 결과가 나옴
@GetMapping("/read")
public ResponseEntity<? extends ResponseDto> read(
@RequestParam("age") int userAge,
@RequestParam("name") String userName) {
String userInfo = userName + "(" + userAge + ")";
return ResponseEntity.ok().body(DataResponseDto.of(userInfo));
}
}
- Request
- Response
@RestController
public class BasicRestController {
@GetMapping("/read2/{id}")
// @PathVariable("id") int userId 같은 매개변수
// GET,POST,PUT 가능
public ResponseEntity<? extends ResponseDto> read2(@PathVariable int id) {
Map<Integer, String> userMap = new HashMap<>();
userMap.put(1, "김준일");
userMap.put(2, "김준이");
userMap.put(3, "김준삼");
userMap.put(4, "김준사");
userMap.put(5, "김준오");
return ResponseEntity.ok().body(DataResponseDto.of(userMap.get(id)));
}
}
- Request
- Response
@RestController
public class BasicRestController {
@PostMapping("/create")
public ResponseEntity<? extends ResponseDto> create(@RequestBody BasicTestDto basicTestDto) {
System.out.println("데이터 추가");
// created는 uri를 넣을 수 있는데 생성 시 해당 uri로 이동 가능
return ResponseEntity.created(null).body(DataResponseDto.of(basicTestDto));
}
}
2. Dto
■ BasicTestDto(Request)
package com.web.study.dto.request;
import lombok.Data;
@Data
public class BasicTestDto {
private int age;
private String name;
}
■ ResponseDto(Response)
package com.web.study.dto;
import lombok.Data;
import lombok.RequiredArgsConstructor;
//jackson이 가져와서 데이터를 json으로 변환해야하기 때문에 getter 필요
@Data
@RequiredArgsConstructor
public class ResponseDto {
private final boolean success;
private final int code;
private final String message;
public static ResponseDto ofDefault() {
return new ResponseDto(true, 200, "Successfully");
}
public static ResponseDto of(boolean success, int code, String message) {
return new ResponseDto(success, code, message);
}
}
■ DataResponseDto(Response)
package com.web.study.dto;
import org.springframework.http.HttpStatus;
import lombok.Data;
@Data
public class DataResponseDto<T> extends ResponseDto{
private final T data;
private DataResponseDto(T data) {
super(true, HttpStatus.OK.value(), "Successfully");
this.data = data;
}
private DataResponseDto(T data, String message) {
super(true, HttpStatus.OK.value(), message);
this.data = data;
}
public static <T> DataResponseDto<T> of(T data) {
return new DataResponseDto<T>(data);
}
public static <T> DataResponseDto<T> of(T data, String message) {
return new DataResponseDto<T>(data,message);
}
public static <T> DataResponseDto<T> empty() {
return new DataResponseDto<T>(null);
}
}
■ ErrorResponseDto(Response)
package com.web.study.dto;
import java.util.Map;
import org.springframework.http.HttpStatus;
import lombok.Data;
@Data
public class ErrorResponseDto extends ResponseDto{
private Map<String, String> errorData;
private ErrorResponseDto(HttpStatus status) {
super(false, status.value(), "Failed");
}
private ErrorResponseDto(HttpStatus status, Exception e) {
super(false, status.value(), e.getMessage());
}
private ErrorResponseDto(HttpStatus status, Exception e, Map<String, String> errorData) {
super(false, status.value(), e.getMessage());
this.errorData = errorData;
}
public static ErrorResponseDto of(HttpStatus status) {
return new ErrorResponseDto(status);
}
public static ErrorResponseDto of(HttpStatus status, Exception e) {
return new ErrorResponseDto(status,e);
}
public static ErrorResponseDto of(HttpStatus status, Exception e, Map<String, String> errorData) {
return new ErrorResponseDto(status,e, errorData);
}
public static ErrorResponseDto empty() {
return new ErrorResponseDto(null);
}
}