Skip to content
On this page

Controller

Annotation

  • class
    • @RestController json데이터를 응답하는 컨트롤러
    • @RequestMapping("/프로그램이름 camelcase") url의 매핑시작
    • @Slf4j log.debug 등의 로깅 메소드 사용할때만 추가
  • method
    • @RequestMapping("/메소드이름") GET, POST 둘다 가능.
    • @PostMapping("/query") POST 방식만 가능.
    • @GetMapping("/query") GET 방식만 가능.
    • @RequestBody POST 방식으로 서버와 클라이언트가 주고받는 데이터는 모두 json이고, http request의 body 에 존재한다. json을 매칭되는 class나 map으로 변환해준다.
    • @RequestParam GET 방식일때는 사용.
      @PostMapping("/query")
      public ResMap query(@RequestBody FormGridParam param) {
      
      @GetMapping("/query")
      public ResMap query(@RequestParam FormGridParam param) {
      
  • 변수
    • service, mapper등의 컴포넌트는 @Autowired 대신 @RequiredArgsConstructor를 사용한다.
      @RestController
      @RequiredArgsConstructor
      @RequestMapping("/bankAccountRegPopup")
      public class BankAccountRegPopupController {
        private final BankAccountRegPopupService service;
    
    • @Value application.yml에 설정한 값을 주입.
      키와 값이 존재하지 않으면 서버 구동이 실패하므로 :뒤에 기본값을 지정한다.
      @Value("${vmerp.task.pdf-delete-delay:300}")
      @Value("${vmerp.path.manual:#{null}}")
      

네이밍

  • 조회성 메소드의 이름은 query 또는 get으로 시작한다.
  • 저장성 메소드의 이름은 save로 시작한다.
  • 메소드의 requestmapping값은 메소드명과 동일하게 한다.

않좋음

	@PostMapping("/query")
	public ResMap search(@RequestBody FormGridParam param) {
	}

좋음

	@PostMapping("/query")
	public ResMap query(@RequestBody FormGridParam param) {
	}

메소드의 Return Type

  • return type으로 ResMap 사용하는 것이 프로젝트에 세팅된 기본 규칙이므로 controller의 모든 메소드에 사용한다.
    ResMap은 데이터가 data 필드에 입력된다.
    또한 put메소드를 chaining으로 담을 수 있다.

    	@PostMapping("/query")
        public ResMap query(@RequestBody FormGridParam param) {
        /**
        * 조회결과가 여러개이면 ResMap으로 return한다.
        * chaing으로 여러번 put으로 담는다.
        */
        return new ResMap(service.query(param))
            .put("fileList", service.queryUpload(param))
            .put("other", "다른 데이터");
      }
    
    // 생성된 json
    {
      "result": "ok",
      "data": []  //service에서 return하는 결과데이터
      "fileList": []
      "other": "다른 데이터" //메인 결과외에 추가한 데이터
    }
    
    //vue에서 호출한 axios의 response 형태
    {
      data: {
        data: service에서 return하는 결과데이터
        other: 메인 결과외에 추가한 데이터
        result: "ok"
      },
      config: {},
      headers: {},
      request: {},
      status: 200,
      statusText: ""
    }
    
  • 예외적인 경우 return type으로 JavaBean 또는 List<JavaBean> 사용 할 수 있으나 ResMap 사용을 추천함.
    client의 axios의 response 형태는 return type에 따름

    // Map or JavaBean : 
    {}
    // List : 
    [{}] 
    

Example

package com.vmerp.sample.form_grid;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.vmerp.business.common.file.FileService;
import com.vmerp.business.common.model.UploadParam;
import com.vmerp.common.mvc.ResMap;
import com.vmerp.sample.model.FormGrid;

import lombok.extern.slf4j.Slf4j;

@RestController                   // json 주고받기용 컨트롤러 선언
@RequestMapping("/formGrid")      // 프로그램이름으로 매핑경로
@Slf4j                            // log.debug로 로깅 할때만 추가
public class FormGridController {

	@Autowired
	FormGridService service;      // 프로그램의 서비스 주입

	@Autowired
	FileService fileService;      // 첨부파일 서비스 주입

	/**
	 * 폼-그리드의 데이터를 조회한다.
	 * 조회결과가 여러개 가능.
	 * return type이 Map일때 client에 응답형태는 "data"를 key로 하는 JsonObject가 된다.
	 * *) 서버응답 json 
	 * {
	 *   "result": "ok",
	 *   "data": service에서 return하는 결과데이터
	 *   "other": 메인 결과외에 추가한 데이터
	 * }
	 * 
	 * * client의 axios의 response 형태
	 * response 객체
	 * {
	 *   data: {
	 *     data: service에서 return하는 결과데이터
	 *     other: 메인 결과외에 추가한 데이터
	 *     result: "ok"
	 *   },
	 *   config: {},
	 *   headers: {},
	 *   request: {},
	 *   status: 200,
	 *   statusText: ""
	 * }
	 * 
	 * @param param FormGridParam
	 * @return ResMap 
	 *         "data" : 메인 데이터,
	 *         "fileList" : 첨부파일목록
	 *         "other" : 다른 데이터
	 *         
	 */
	@PostMapping("/query")        // 조회 메소드 매핑. 이름은 "query"로 시작
	public ResMap query(@RequestBody FormGridParam param) {
		/**
		 * 조회결과가 여러개이면 ResMap으로 return한다.
		 * chaing으로 여러번 put으로 담는다.
		 */
		return new ResMap(service.query(param))
				.put("fileList", service.queryUpload(param))
				.put("other", "다른 데이터");
	}

	/**
	 * 폼-그리드의 데이터를 조회한다.
	 * 조회결과가 한개일때.
	 * return type이 JavaBean, List<JavaBean>이면 
	 * client에 응답형태는 service의 return에 따라 JsonObject 또는 JsonArray가 된다.
	 * *) 서버응답 json 
	 * 
	 * * client의 axios의 response 형태는 return type에 따름
	 * Map or JavaBean : {}
	 * List : [{}] 
	 * 
	 * @param param FormGridParam
	 * @return List<FormGrid>
	 */

	@PostMapping("/queryList")        // 조회 메소드 매핑. 이름은 "query"로 시작
	public List<FormGrid> queryList(@RequestBody FormGridParam param) {
		return service.query(param);
	}
	
	/**
	 * 저장하는 메소드
	 * @param param FormGridParam
	 * @return ResMap
	 */
	@PostMapping("/save")         // 저장 메소드 매핑. 이름은 "save"로 시작
	public ResMap saveSaveParam(@RequestBody FormGridParam param) {
		return new ResMap(service.save(param));
	}

	/**
	 * 첨부파일있는 저장 메소드
	 * @param param 저장하는 json 부분
	 * @param uploadParam 첨부파일의 부가정보 
	 * @param files 첨부파일
	 * @return
	 */
	@PostMapping("/saveUpload")
	public ResMap upload(
			@RequestPart("data") FormGridParam param,
			@RequestPart("uploadData") UploadParam uploadParam, 
			MultipartFile[] files) {

		log.debug(" upload >>>>>>>>>>>>>>>>>>>>>>>>");
		log.debug("jsonData = {}", param);
		log.debug("multipart files = {}", new Object[] { files });
		log.debug("<<<<<<<<<<<<<<<<<<<<<<<<< upload");

		//[첨부파일처리 1] cmmFile 정보 세팅하고 첨부파일 폴더이동 
		fileService.cmmFile1Prepare("SAMPLE", uploadParam, files);
		try {
			return new ResMap(service.saveUpload(param, uploadParam));
		} finally {
			//[첨부파일처리 4] 오류 또는  
			fileService.cmmFile4Delete(uploadParam);
		}
	}
}

Hello