본문 바로가기
프로그래밍/Springboot-토이프로젝트

Springboot + JQuery Ajax로 CRUD 어플리케이션 구현-03【CRUD API구현】

by 코이킹 2021. 6. 6.
반응형

지난 포스트에서 Springboot의 설정을 마쳤고 이 포스트에서는 API를 구현하고 Postman으로 동작확인을 해보겠습니다. 

 

전체 소스코드는 아래에 URL에 있습니다.

https://github.com/leeyoungseung/item-admin

 

1. DB 설치 및 테이블 생성

1) DB 설치 

개발 시 사용할 DB는 MySQL(MariaDB)로 XAMPP  v3.2.3을 설치하면 패키지로 설치되는 DB입니다.
https://www.apachefriends.org/blog/new_xampp_20190415.html

 

New XAMPP release 7.1.28 , 7.2.17 , 7.3.4

 

www.apachefriends.org

 

2) 테이블 생성 

XAMPP Control Panel에서 Apache와 MySQL을 'Start'합니다. 

 

Actions가 Stop상태가 되면 DB가 기동한 것입니다.

XAMPP에서 DB를 관리할 때 phpMyAdmin이라는 웹 페이지로 된 관리 툴을 사용할 것이므로 Apache도 실행해주어야 합니다. 

MySQL의 Admin을 클릭해서 phpMyAdmin에 접속합니다.

 


개발 시 사용할 데이터 베이스를 생성합니다. 

※ 데이터 베이스 생성 방법

'데이터 베이스' -> '새 데이터베이스 만들기' -> 데이터베이스명을 입력한 후 '만들기'버튼 클릭 



생성한 데이터 베이스를 클릭 -> 상단의 SQL 메뉴에서 테이블 생성 SQL을 입력한 후 실행합니다.

 

※ SQL문

--
-- 테이블 구조 `item`
--
CREATE TABLE `item` (
  `ITEM_ID` int(11) NOT NULL,
  `ITEM_NAME` varchar(100) NOT NULL,
  `ITEM_DESCRIPTION` text NOT NULL,
  `MAKER_CODE` varchar(50) NOT NULL,
  `PRICE` int(11) NOT NULL,
  `SALE_STATUS` int(11) NOT NULL,
  `IMAGES` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- 기본키 설정
--
ALTER TABLE `item`
  ADD PRIMARY KEY (`ITEM_ID`);
--
-- AUTO_INCREMENT 설정
--
ALTER TABLE `item`
  MODIFY `ITEM_ID` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
COMMIT;


1. 등록 기능(C)

1) 컨트롤러 

	@PostMapping(path = "/items")
	public ResponseEntity<String> createItemOne(@RequestBody Item item ) {
        // @RequestBody :  request body에 실어서 보낸 json 형식의 데이터를 
        // Item 객체로 매핑해준다. 
    
		log.info("ItemAdminController createItemOne Form : "+item);
		return itemService.createItem(item);
	}


2) 서비스

	public ResponseEntity<String> createItem(Item item) {
		log.info("ItemService createItem ID : "+item);
		
        // 같은 이름의 상품이 등록되어 있는지 확인 
		Optional<Item> existItem = itemRepository.findByItemName(item.getItemName());
		if (!existItem.isEmpty()) {
			return ResponseEntity.badRequest()
					.body("Item exist.");
		}
		
        // 상품정보 등록
		Item createdItem = itemRepository.save(item);
		
        // 결과 리턴
		return ResponseEntity.status(HttpStatus.OK)
		        .body("Item applied ["+createdItem.getItemId()+"]");
	}


3) 리퀘스트 예문 

POST http://localhost:8080/api/items  
{
  "itemName":"testItem101",
  "itemDescription":"testItem101_itemDescription",
  "makerCode":"100",
  "price":1500,
  "saleStatus":1,
  "images":"test.png"
}

4) Postman동작확인

 


2. 읽기 기능(R)


1) 컨트롤러 

	@GetMapping(path = "/items/{itemId}")
	public ResponseEntity<Item> getItemOne(@PathVariable int itemId) {
        //@PathVariable : URI경로상의 문자열, 숫자를 변수로 사용할수 있게 해줌.
		log.info("ItemAdminController getItemOne ID : "+itemId);
		return itemService.getItem(itemId);
	}


2) 서비스

	public ResponseEntity<Item> getItem(int itemId) {
		log.info("ItemService getItem ID : "+itemId);
		Optional<Item> item = itemRepository.findById((Integer)itemId);
		
		log.info("ItemService Item : "+item.get());
		return ResponseEntity.of(item);
	}


3) 리퀘스트 예문 

GET http://localhost:8080/api/items/104


4) Postman동작확인


3. 갱신 기능(U)

1) 컨트롤러 

	@PutMapping(path = "/items/{itemId}")
	public ResponseEntity<Item> updateItemOne(@PathVariable int itemId, 
			@RequestBody Item item) {
        // @PathVariable, @RequestBody을 같이 사용하는 것도 가능
		log.info("ItemAdminController updateItemOne ID : "+itemId);
		log.info("ItemAdminController updateItemOne Form : "+item);
		
		return itemService.updateItem(itemId, item);
	}


2) 서비스

	public ResponseEntity<Item> updateItem(int itemId, Item item) {
		log.info("ItemService updateItem ID : "+itemId);
		
        // 상품정보가 존재하는지 확인
		Item existItem = itemRepository.findById((Integer)itemId)
				.orElseThrow(() -> new ResourceNotFoundException("Not Found Item : "+itemId));
		
		log.info("ItemService updateItem exist : "+existItem);
		log.info("ItemService updateItem update : "+item);
		
        // 상품정보 갱신
		existItem.setItemDescription(item.getItemDescription());
		existItem.setMakerCode(item.getMakerCode());
		existItem.setPrice(item.getPrice());
		existItem.setSaleStatus(item.getSaleStatus());
		
        // 결과 리턴
		return ResponseEntity.ok(itemRepository.save(existItem));
	}


3) 리퀘스트 예문 

PUT http://localhost:8080/api/items/104
{
  "itemName":"testItem101",
  "itemDescription":"testItem101_itemDescriptionUpdated01",
  "makerCode":"100",
  "price":2500,
  "saleStatus":1,
  "images":"test.png"
}


4) Postman동작확인


5. 삭제 기능(D)

1) 컨트롤러 

	@DeleteMapping("/items/{itemId}")
	public ResponseEntity<Map<String, Boolean>> deleteItemOne(@PathVariable int itemId) {
		log.info("ItemAdminController deleteItemOne ID : "+itemId);
		
		return itemService.deleteItem(itemId);
	}


2) 서비스

	public ResponseEntity<Map<String, Boolean>> deleteItem(int itemId) {
		log.info("ItemService deleteItem ID : "+itemId);
        
        // 상품정보 존재확인
		Item existItem = itemRepository.findById((Integer)itemId)
				.orElseThrow(() -> new ResourceNotFoundException("Not Found Item : "+itemId));
		
        // 상품정보 삭제
		itemRepository.delete(existItem);
		
        // 결과 리턴
        Map<String, Boolean> response = new HashMap<>();
		response.put("deleted", Boolean.TRUE);
		return ResponseEntity.ok(response);
	}


3) 리퀘스트 예문 

DELETE http://localhost:8080/api/items/104


4) Postman동작확인

 

 

반응형

댓글