/ SPRING

스프링 백엔드RESTFULL 적용

스프링 목록

스프링 부트 목록




REST란?(링크)

REST(Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다.

엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음이다. 여기서 ‘네트워크 아키텍처 원리’란 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반을 일컫는다





기존 코드와 달라진점

  • Controller @RestController 태그로 어노테이션 교체
  • JSON 형태로 기존에 썻던 @ResponseBody 제거하기
    (RESTFULL 쓰는순간 모든 자료교환은 JSON으로 하기떄문)

  • 기존 modify, remove , get 다 board url로 합칠수 있게됨

  • 이제부터 GET, POST, PUT, DELETE 매핑 사용

  • url에 담겨있는 정보는 @PathVariable로 파라미터 앞에 어노테이션 추가
    이제부터는 @RequestParam(defaultValue) 못 씀
    따라서, 자바의 Optional<> 사용해야함(null 값 방지)
임폴트 구문(펼치기)
package com.my.board.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;

import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.my.board.service.RepBoardService;
import com.my.board.vo.RepBoard;
import com.my.customer.vo.Customer;
import com.my.exception.AddException;
import com.my.exception.FindException;
import com.my.exception.ModifyException;
import com.my.exception.RemoveException;

import net.coobird.thumbnailator.Thumbnailator;





1. 기존 태그에 @Controller 교체

@RestController
// 이 컨트롤러에 속한 url은 모두 board/..
@RequestMapping("board/*")
public class RepBoardController {
}





2. info() 수정 GET[게시물 하나 불러오기]


	@GetMapping("/{no}")
					   //url에 no가 넘어오는 변수인걸 적어줘야함
	public Object info(@PathVariable int no) {

		try {
			RepBoard rb = service.findByNo(no);
			Map<String, Object> info = new HashMap<String, Object>();

			info.put("boardNo", rb.getBoardNo());
			info.put("boardTitle", rb.getBoardTitle());
			info.put("boardC", rb.getBoardC());
			info.put("boardDt", rb.getBoardDt());
			info.put("boardContent", rb.getBoardContent());
			info.put("boardViewcount", rb.getBoardViewcount());
			
			File dir = new File(saveDirectory);
			List<String> filesNameList = new ArrayList<String>();

			for (String fileName : dir.list()) {
				String [] splitedName =fileName.split("_");
				if(splitedName[0].equals(""+no)) {
					filesNameList.add(fileName);
				}
			}
			info.put("files", filesNameList);

			
			return info;

		} catch (FindException e) {
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			e.printStackTrace();

			return rm;
		}
	}





3. modfiy 수정 PUT[게시물 수정]

@PutMapping("/{boardNo}")
	public Map<String, Object> modify(@PathVariable int boardNo,
									  @RequestBody RepBoard rb,
									  HttpSession session) {

		Customer c = new Customer();
		c.setId("id1");

		try {
			rb.setBoardC(c);
			rb.setBoardNo(boardNo);
			service.modify(rb);
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", "수정 성공");
			rm.put("status", 1);
			return rm;
		} catch (ModifyException e) {
			// TODO Auto-generated catch block
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			e.printStackTrace();
			return rm;
		}
	}





4. romve 수정 DELETE[기존 게시물 삭제]

	@DeleteMapping("/{boardNo}")
	public Map<String, Object> remove(@PathVariable int boardNo) {

		try {
			RepBoard rb = new RepBoard();
			rb.setBoardNo(boardNo);

			service.remove(rb);
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", "삭제 성공");
			rm.put("status", 1);
			return rm;
		} catch (RemoveException e) {
			// TODO Auto-generated catch block
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			e.printStackTrace();
			return rm;
		}
	}

(/board )url하나로 글 불러오기, 수정, 삭제 다 가능





5. list() 수정 GET[모든 게시물 불러오기]

	@GetMapping({"/list/{page}" , "/list"})
	public Object list(@PathVariable Optional<Integer> page) {
		try {
				List<RepBoard> list;
				if(page.isPresent()) {
					 list = service.findAll(page.get());
				}else {
					 list = service.findAll();
				}
			return list;
		} catch (FindException e) {
			Map<String, Object> returnMap = new HashMap<>();
			returnMap.put("msg", e.getMessage());
			returnMap.put("status", 0);
			return returnMap;
		}





수정 완료 코드


@RestController
@RequestMapping("board/*")
public class RepBoardController {

	private	String saveDirectory = "f:\\files";
	private int s_width=100;
	private int s_height=100;
	@Autowired
	private RepBoardService service;

	Logger log = Logger.getLogger(this.getClass());



	// servlet-context에 mvc추가후, mvc탭 ->어노테이션 드리븐
	@GetMapping({"/list/{page}" , "/list"})
	public Object list(@PathVariable Optional<Integer> page) {
		try {
				List<RepBoard> list;
				if(page.isPresent()) {
					 list = service.findAll(page.get());
				}else {
					 list = service.findAll();
				}
			return list;
		} catch (FindException e) {
			Map<String, Object> returnMap = new HashMap<>();
			returnMap.put("msg", e.getMessage());
			returnMap.put("status", 0);
			return returnMap;
		}

	}
	
	
	@GetMapping("/{no}")
					   //url에 no가 넘어오는 변수인걸 적어줘야함
	public Object info(@PathVariable int no) {

		try {
			RepBoard rb = service.findByNo(no);
			Map<String, Object> info = new HashMap<String, Object>();

			info.put("boardNo", rb.getBoardNo());
			info.put("boardTitle", rb.getBoardTitle());
			info.put("boardC", rb.getBoardC());
			info.put("boardDt", rb.getBoardDt());
			info.put("boardContent", rb.getBoardContent());
			info.put("boardViewcount", rb.getBoardViewcount());
			
			File dir = new File(saveDirectory);
			List<String> filesNameList = new ArrayList<String>();

			for (String fileName : dir.list()) {
				String [] splitedName =fileName.split("_");
				if(splitedName[0].equals(""+no)) {
					filesNameList.add(fileName);
				}
			}
			info.put("files", filesNameList);

			
			return info;

		} catch (FindException e) {
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			e.printStackTrace();

			return rm;
		}
	}
	
	@PutMapping("/{boardNo}")
	public Map<String, Object> modify(@PathVariable int boardNo,
									  @RequestBody RepBoard rb,
									  HttpSession session) {

		Customer c = new Customer();
		c.setId("id1");

		try {
			rb.setBoardC(c);
			rb.setBoardNo(boardNo);
			service.modify(rb);
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", "수정 성공");
			rm.put("status", 1);
			return rm;
		} catch (ModifyException e) {
			// TODO Auto-generated catch block
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			e.printStackTrace();
			return rm;
		}
	}

	@DeleteMapping("/{boardNo}")
	public Map<String, Object> remove(@PathVariable int boardNo) {

		try {
			RepBoard rb = new RepBoard();
			rb.setBoardNo(boardNo);

			service.remove(rb);
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", "삭제 성공");
			rm.put("status", 1);
			return rm;
		} catch (RemoveException e) {
			// TODO Auto-generated catch block
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			e.printStackTrace();
			return rm;
		}
	}





	@PostMapping("board/reply")
	public Map<String, Object> reply(@RequestBody RepBoard inRepboard) {

		//TODO 프론트에서 boardC.id 로 값주면 왜 자동매핑 안되는지?..
		try {
			
			if( inRepboard.getParentNo() == 0) {
				throw new AddException("부모번호가 없습니다.");
			}

			service.add(inRepboard);
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", "추가 성공");
			rm.put("status", 1);
			return rm;
		} catch (AddException e) {
			// TODO Auto-generated catch block
			Map<String, Object> rm = new HashMap<String, Object>();
			rm.put("msg", e.getMessage());
			rm.put("status", 0);
			return rm;
		}
	}




	

스프링 목록

스프링 부트 목록