본문 바로가기
Back end/Spring

[Spring] Controller, Dto

by 더 이프 2023. 7. 25.
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);
    	}
    	
    }