인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

e0157510870's profile image
e0157510870

asked

Real-world! Spring Boot and JPA Utilization 2 - API Development and Performance Optimization

html에서 DTO에담긴 객체형식이 전송가능할까요?

Resolved

Written on

·

953

0

안녕하세요? 강의 잘 듣고있습니다.
html에서 DTO에담긴 객체형식이 전송가능할까요?
String city, street, zipcode가 포함된 객체 Address를 담은 회원등록DTO를 이용해서 회원등록기능을 만들고있는데요,
html에선 form.address.city, form.address.street이런식으로 , 위치를 지정하면 될거라 생각하였는데,
Strin이나 int 등은 값이 잘 저장되는데, address에 속한 값들은 자바에선 null로만 받아져요.
반대로 조회할때는 form.address.city, form.address.street를 이용하니 문제없이 조회가 되었습니다.
즉 자바에서 html로는 DTO안의 객체형식이 제대로 전송되는데, html에서 자바로는 DTO의 객체형식이 전송이 안되는 상태인데,
애초에 등록페이지에 모델로 해당 DTO를 form으로 전송시켜놓았고, 그래서 form.address.city으로 위치를 지정해서 값을 저장하면
문제없이 될거라 생각했는데, 어디서 잘못된걸까요?
관련코드입니다.
DB
1,2행은 수동으로 추가하였습니다
DTO
public class CompanyDTO {

private Long id;
private String name;
private Address address;
Controller
@GetMapping("register")
public String companyRegister(Model model) {

model.addAttribute("form", new CompanyDTO());
return "company/register";
}

@PostMapping("register")
public String companyRegister2(CompanyDTO companyDTO) {
companyService.saveCompany(companyDTO);
return "redirect:/company/list";
}
@GetMapping("list")
public String companyList(Model model) {
List<Company> companyList = companyService.findAll();
List<CompanyDTO> companyDTOList = companyService.transDTOList(companyList);
model.addAttribute("company_list", companyDTOList);
return "company/list";
}
html register(등록부분) > 이 부분이 안됩니다!
<form th:action="@{register}" th:object="${form}" method="post">
<div class="form-group">
<label th:for="name">회사명</label>
<input type="text" th:field="*{name}" class="form-control"
placeholder="이름을 입력하세요">
</div>
<div class="form-group">
<label th:for="city">도시</label>
<input type="text" th:field="*{address.city}" class="form-control"
placeholder="주소를 입력하세요">
</div>

html list(조회부분) > 정상동작합니다

<tr th:each="company : ${company_list}">
<td th:text="${company.id}"></td>
<td th:text="${company.name}"></td>
<td th:text="${company.address.city}"></td>

감사합니다

JPAjavaspring-bootspring

Answer 2

1

안녕하세요 안준석님. 다음과 같이 샘플 코드 구현하여 테스트 해봤는데 정상 작동 하였습니다.

일단 2가지 확인이 필요할 것으로 보입니다.

1. 폼 데이터가 @PostMapping에서 값을 잘 받아오는지

@PostMapping("register")
public String companyRegister2(CompanyDTO companyDTO) {
companyService.saveCompany(companyDTO);
// companyDTO의 값을 log 혹은 콘솔 출력을 하여 잘 받아 왔는지 확인
return "redirect:/company/list";
}

2. 잘 받아 왔다면 DB까지 가는 과정에서 값의 변경이 있는지

 companyService.saveCompany(companyDTO); // 이 saveCompany부터 DB까지 과정에서 값이 제대로 저장되는지 확인

e0157510870님의 프로필 이미지
e0157510870
Questioner

답변 고마워요.

PostMapping에서 Address값이 null인것을 확인했고,

올려주신 코드랑 비교하면서 원인을 계속찾다가,

Address클래스에 Getter만 설정해뒀던것을 발견했어요

만들때는 Address도 엔티티안에 속하니 Setter가 없는편이 나을거라 생각해 없앴는데,

Setter가없으니 당연히 값이 안받아와졌던 거네요

이 부분은 AddressDTO를 하나더 추가해서 해결하였어요.

감사합니다.

해결하셨다니 다행이네요

도움이 되어 기쁘네요ㅎㅎ

오! setter의 문제였군요. 해결되어 다행입니다!

1

안녕하세요 안준석님!

혹시 input 태그에 name 속성을 줘보시겠어요? 아래처럼요.

<input type="text" name="name" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요">
<input type="text" name="address.city" th:field="*{address.city}" class="form-control" placeholder="주소를 입력하세요">

.

감사합니다.

e0157510870님의 프로필 이미지
e0157510870
Questioner

답변감사해요

말씀대로 해보았는데, html에서 나타나는 name과 전송되는 값에는 변화가 없었어요.

아래는 구글 개발자도구로 본 input태그의 name입니다.

e0157510870's profile image
e0157510870

asked

Ask a question