inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

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

해결된 질문

992

안준석

작성한 질문수 7

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>

감사합니다

JPA java spring-boot spring

답변 2

1

OMG

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

일단 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까지 과정에서 값이 제대로 저장되는지 확인

0

안준석

답변 고마워요.

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

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

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

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

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

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

감사합니다.

0

OMG

해결하셨다니 다행이네요

도움이 되어 기쁘네요ㅎㅎ

0

나무늘보

오! 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="주소를 입력하세요">

.

감사합니다.

0

안준석

답변감사해요

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

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

@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.

0

32

2

강의 관련 외 질문입니다.

0

91

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

1

112

1

BeanCreationException

0

104

3

Update 후 UpdateMemberResponse 매핑할 때

0

65

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

109

2

페이징 + 검색조건 관련해서 질문드립니다.

0

77

1

Query Dsl Q파일 질문입니다.

0

92

1

루트 쿼리라는것은

0

68

1

메서드를 분리하는 기준

0

76

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

123

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

97

2

fetch join과 영속화와 OSIV의 관계

0

101

2

Distinct 사용 전 결과에 대한 의문

0

124

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

65

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

82

2

dto 필드 속 엔티티 여부

0

67

1

뷰템플릿 사용 시

0

86

2

Result 클래스 관련 질문

0

59

1

@PostConstruct 프록시 관련 질문드립니다

0

91

1

DTO 대신 Form 사용은 안되나요?

0

142

1

OSIV ON 상태일 때

0

102

1

fetch join VS fetch join 페이징 궁금증

0

192

2

양방향 연관관계 알아보는 법?

0

113

1