Appearance
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}}")
- service, mapper등의 컴포넌트는
네이밍
- 조회성 메소드의 이름은
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);
}
}
}