
1. ItemController 만들기
- Spring Boot 애플리케이션에서 RESTful API를 구현하는 컨트롤러 클래스
Item
엔티티에 대한 CRUD (Create, Read, Update, Delete) 작업을 수행
- XML 파일을 사용하여 JSON 데이터를 저장하고 로드하는 기능이 포함
클래스 및 필드
@RestController
: REST API의 컨트롤러임을 명시
JSON 또는 XML로 응답을 반환
@RequestMapping("/items")
:/items
경로로 들어오는 요청을 이 컨트롤러가 처리
@CrossOrigin
: CORS 설정을 통해 특정 도메인 요청을 허용
@Autowired
: Spring의 의존성 주입을 통해 주입
Get 요청 처리 - getAllItems
@GetMapping
:/items
경로로 들어오는 GET 요청을 처리
- 모든 아이템을 조회하여 반환
- XML 파일에서 데이터를 가져올 수 있는 경우, 파일에서 아이템을 조회하고 JSON으로 변환하여 반환
- 크기가 커질수록 JSON 변환과 XML 저장에 시간이 소요될 수 있음
Get 요청 처리 - getItemById
@GetMapping("/{id}")
:/items/{id}
경로로 들어오는 GET 요청을 처리
- 주어진 ID로 아이템을 조회
- 존재하면 200 OK 응답
- 존재하지 않으면 404 NOT FOUND 응답을 반환
POST 요청 처리 - createItem
@PostMapping
:/items
경로로 들어오는 POST 요청을 처리
- 요청 받은 아이템을 저장
- 모든 아이템을 JSON으로 변환한 후 XML로 저장
PUT 요청 처리 - updateItem
@PutMapping("/{id}")
:/items/{id}
경로로 들어오는 PUT 요청을 처리
- 주어진 ID의 아이템을 조회
- 존재하면 업데이트 후 XML로 저장
- 존재하지 않으면 404 NOT FOUND 응답을 반환
DELETE 요청 처리 - deleteItem
@DeleteMapping("/{id}")
:/items/{id}
경로로 들어오는 DELETE 요청을 처리
- 주어진 ID의 아이템을 삭제
- 모든 아이템을 JSON으로 변환한 후 XML로 저장
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
@RestController
@RequestMapping("/items")
@CrossOrigin(origins = "http://localhost:8080")
public class ItemController {
@Autowired
private ItemRepository itemRepository;
@Autowired
private FileStorage fileStorage;
@GetMapping
public ResponseEntity<String> getItems() {
try {
String jsonFromXml = fileStorage.getItemsAsJson();
return new ResponseEntity<>(jsonFromXml, HttpStatus.OK);
} catch (IOException e) {
List<Item> items = itemRepository.findAll();
try {
String jsonFromDb = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(items);
return new ResponseEntity<>(jsonFromDb, HttpStatus.OK);
} catch (IOException jsonException) {
return new ResponseEntity<>("Error occurred while converting data to JSON", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
@GetMapping("/{id}")
public ResponseEntity<Item> getItemById(@PathVariable int id) {
Optional<Item> item = itemRepository.findById(id);
return item.map(i -> new ResponseEntity<>(i, HttpStatus.OK))
.orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
@PostMapping
public ResponseEntity<Item> createItem(@RequestBody Item item) {
try {
Item createdItem = itemRepository.save(item);
saveAllItemsToXml();
return new ResponseEntity<>(createdItem, HttpStatus.CREATED);
} catch (IOException e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PutMapping("/{id}")
public ResponseEntity<Item> updateItem(@PathVariable int id, @RequestBody Item item) {
Optional<Item> existingItem = itemRepository.findById(id);
if (existingItem.isPresent()) {
try {
item.setId(id);
Item updatedItem = itemRepository.save(item);
saveAllItemsToXml();
return new ResponseEntity<>(updatedItem, HttpStatus.OK);
} catch (IOException e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteItem(@PathVariable int id) {
itemRepository.deleteById(id);
try {
saveAllItemsToXml();
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} catch (IOException e) {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
private void saveAllItemsToXml() throws IOException {
List<Item> items = itemRepository.findAll();
String jsonData = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(items);
fileStorage.saveItemsAsXml(jsonData);
}
}
Share article