suminiee / 2024_Baseball_diary

0 stars 0 forks source link

Spring MVC가 @RequestBody를 여러개 사용하는 경우 DTO 여러개를 한번에 처리하지 못하는 현상 #10

Open suminiee opened 4 months ago

suminiee commented 4 months ago

Postman에서 테스트 중이었는데 처음에는 RequestBody에 DTO를 여러개 주려고 했는데 오류가 발생함 찾아보니까 두 개 이상의 '@RequestBody'가 사용되는 경우 Spring MVC가 이를 처리할 수 없어서 오류가 발생한다고 한다. 두 개 이상의 DTO를 RequestBody로 주려고 하는 경우에는 DTO 여러개들을 하나의 래퍼 객체로 감싸서 사용해야 한다고 한다.

해결방법 예시

@Data
public class CombinedDiaryRequestDto {
private DiarySaveRequestDto diarySaveRequestDto;
private LineUpNameSaveRequestDto lineUpNameSaveRequestDto;
private LineUpPositionSaveRequestDto lineUpPositionSaveRequestDto 
}
suminiee commented 4 months ago

이 방법 말고 ObjectNode saveObj을 이용하여 코드 작성함

ObjectNode 이용


ObjectMapper mapper = new ObjectMapper();
DiarySaveRequestDto diarySaveRequestDto = mapper.treeToValue(saveObj.get("diarySaveRequestDto"), DiarySaveRequestDto.class);
LineUpNameSaveRequestDto lineUpNameSaveRequestDto = mapper.treeToValue(saveObj.get("lineUpNameSaveRequestDto"), LineUpNameSaveRequestDto.class);
suminiee commented 4 months ago

그런데 무결성 관련하여 오류가 발생하여 (FK5mxldl0u6r8wf26ejm51n27h6) 데이터베이스 스키마 수정을 함. (DatabaseInitializer 클래스 작성하여 db 변경 저장)

DatabaseInitializer


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component public class DatabaseInitializer {

@Autowired
private JdbcTemplate jdbcTemplate;

@PostConstruct
public void init() {
    try {
        jdbcTemplate.execute("ALTER TABLE line_up_name_info DROP FOREIGN KEY FK5mxldl0u6r8wf26ejm51n27h6;");
        jdbcTemplate.execute("ALTER TABLE line_up_name_info ADD CONSTRAINT FK5mxldl0u6r8wf26ejm51n27h6 FOREIGN KEY (diary_info) REFERENCES diary_info(diary_id);");
    } catch (Exception e) {
        // Handle exception or log the error
        System.err.println("Database initialization failed: " + e.getMessage());
    }
}

}