์๋ก
DAO์ DTO์ ํค์๋์ ๋ํด์ ์์๋ณด๋ ์ค DTO์ ๋ํด์๋ ์๊ณ ์์ง๋ง DAO๋ ์๋ฌด๋ฆฌ ๋ด๋ Repository ๊ฐ์๋ฐ ๊ฐ์ ๊ฐ๋ ์ธ์ง ๊ถ๊ธํด์ ์ ๋ฆฌํด ๋ณด๊ฒ ๋์์ต๋๋ค. ๊ฒฐ๋ก ์ ๋จผ์ ๋ง์๋๋ฆฌ๋ฉด Repository ํจํค์ง๊ฐ DAO์ ๋๋ค.
1. DAO(Data Access Object)
DAO๋ ์ค์ ๋ก DB์ data์ ์ ๊ทผํ๊ธฐ ์ํ ๊ฐ์ฒด์ ๋๋ค.
- ์ค์ ๋ก DB์ ์ ๊ทผํ์ฌ data๋ฅผ ์ฝ์ , ์ญ์ , ์กฐํ, ์์ ๋ฑ CRUD ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
- Service์ DB๋ฅผ ์ฐ๊ฒฐํ๋ ๊ณ ๋ฆฌ ์ญํ ์ ํฉ๋๋ค.
- Repository package๊ฐ ๋ฐ๋ก DAO์ ๋๋ค.
@Repository
@RequiredArgsConstructor
public class MemberRepository {
private final EntityManager em;
public void save(Member member) {
em.persist(member);
}
public Member findOne(Long id) {
return em.find(Member.class, id);
}
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class).getResultList();
}
public List<Member> findByName(String name) {
return em.createQuery("select m from Member m where m.name =:name", Member.class)
.setParameter("name", name)
.getResultList();
}
}
2. DTO(Data Transfer Object)
DTO๋ ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ก, DTO๋ ๋ก์ง์ ๊ฐ์ง์ง ์๋ ์์ํ ๋ฐ์ดํฐ ๊ฐ์ฒด(Java Beans)์ ๋๋ค.
- DTO๋ ์ฆ, getter/setter ๋ฉ์๋๋ง ๊ฐ์ง ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
- DB์์ ๋ฐ์ดํฐ๋ฅผ ์ป์ด์ Service๋ Controller ๋ฑ์ผ๋ก ๋ณด๋ผ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์ฆ ์ํฐํฐ๋ฅผ DTO ํํ๋ก ๋ณํํ ํ ์ฌ์ฉํฉ๋๋ค.
ํ๋ฒ ์์ ์ฝ๋๋ก ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
- domain(Entity) logic
- DTO logic
- Controller logic
1) ๋จผ์ ์๋์ ๊ฐ์ Entity๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
@Entity
@Getter
@Setter
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
}
2) ์๋๋ DTO class์ ๋๋ค.
@Getter
@Setter
static class ResponseDto {
private String name;
private String result = "๊ฒฐ๊ณผ์
๋๋ค.";
public ResponseDto(Member member) {
name = member.getName();
}
}
3) ์๋๋ Controller logic์ ๋๋ค.
@PostMapping("api/useDTO")
@ResponseBody
public ResponseDto useDTO(@RequestParam String name, @RequestParam Long id) {
Member findMember = memberService.findOne(id);
return new ResponseDto(findMember);
}
@PostMapping("api/notUseDTO")
@ResponseBody
public FindMember notUseDTO(@RequestParam String name, @RequestParam Long id) {
Member findMember = memberService.findOne(id);
return new FindMember(findMember);
}
๊ฒฐ๊ณผ
useDTO ๋ฉ์๋๋ Entitiy์ ๊ฒฐ๊ณผ๋ฅผ DTO๋ก ๋ณํํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ์ธ name๊ณผ result๋ง ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค. ํ์ง๋ง notUseDTO๋ Member์ํฐํฐ์ ๋ชจ๋ ์ ๋ณด ์ฆ, ์ํฐํฐ ๊ทธ ์์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค.
ํ์ฌ ์์๋ DTO๋ฅผ Response์๋ง ์ด์ฉํ์ง๋ง Request์ญ์ ์ ์ฉํ ์ ์์ต๋๋ค.
3. VO(value Object)
VO๋ DTO์ ๋ฌ๋ฆฌ Read-Only์์ฑ์ ์ง๋ ๊ฐ ์ค๋ธ์ ํธ์ ๋๋ค. DTO๋ setter๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ๊ฐ์ด ๋ณํ ์ ์์ง๋ง VO์ ๊ฒฝ์ฐ์๋ getter๋ง ๊ฐ์ง๊ณ ์์ด์ ์์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
DTO์ VO์ ์ฐจ์ด์ ์ DTO๋ ์ธํฐํด์ค ๊ฐ๋ ์ด๊ณ , VO๋ ๋ฆฌํฐ๋ด ๊ฐ ๊ฐ๋ ์ ๋๋ค. VO๋ ๊ฐ๋ค์ ๋ํด Read-Only๋ฅผ ๋ณด์ฅํด์ค์ผ ์กด์ฌ์ ์ ๋ขฐ์ฑ์ด ํ๋ณด๋์ง๋ง DTO์ ๊ฒฝ์ฐ์๋ ๋จ์ง ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๊ทธ๋ฆ์ ์ญํ ์ผ ๋ฟ ๊ฐ์ ๊ทธ์ ์ ๋ฌ๋์ด์ผ ํ ๋์์ผ ๋ฟ์ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์์ฒด์ ์๋ฏธ๊ฐ ์๋ VO์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํด์ผ ํ๋ DTO์ ํน์ฑ์ ๊ฐ๋ ์ด ๋ค๋ฆ ๋๋ค.
๋ฐ๋ผ์ VO์ ํต์ฌ์ ๋ ๊ฐ์ฒด์ ๋ชจ๋ ํ๋ ๊ฐ๋ค์ด ๋์ผํ๋ฉด ๋ ๊ฐ์ฒด๋ ๊ฐ๋ค์ ๋๋ค. ๋ฐ๋ผ์ ์์ ํ ๊ฐ ์์ฒด ํํ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ ๋ชฉ์ ์ด๋ผ๋ฉด, ๋ ๊ฐ์ฒด์ ๋ชจ๋ ํ๋ ๊ฐ๋ค์ด ๋ชจ๋ ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ฐ์ฒด์ด๋๋ก ๋ง๋๋ ๊ฒ(equals() ์ hashCode()์ ์ค๋ฒ๋ผ์ด๋ฉ)์ด ์ค์ํ์ง, ๋ฉ์๋๋ ์ด๋ค ๋ฉ์๋๊ฐ ์๋ ๋ง๋ ์๊ด ์์ต๋๋ค.
DTO์ VO ์ฐจ์ด
์ข ๋ฅ | ์ฉ๋ | ๋๋ฑ ๊ฒฐ์ | ๊ฐ๋ณ / ๋ถ๋ณ | ๋ก์ง |
DTO | - ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ | - ์์ฑ๊ฐ์ด ๋ชจ๋ ๊ฐ์๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ ์ ์์ | - setter ์กด์ฌ ์ ๊ฐ๋ณ, - setter ๋น ์กด์ฌ ์ ๋ถ๋ณ |
- getter/setter ์ด์ธ์ ๋ก์ง์ด ๋ถํ์ํจ |
VO | - ๊ฐ ์์ฒด๋ฅผ ํํ | - ์์ฑ๊ฐ์ด ๋ชจ๋ ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ฐ์ฒด | - ๋ถ๋ณ | - getter/setter ์ด์ธ์ ๋ก์ง์ ๊ฐ์ง ์ ์์ |
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] nested exception is java.lang.NullPointerException (0) | 2022.05.15 |
---|---|
[Spring] ๊ฐ์ฒด๋ณต์ฌ BeanUtils.copyProperties (0) | 2022.05.15 |
[Spring] properties encoding ํ๊ธฐ(๊ตญ์ ํ ํ๊ธ๊นจ์ง) (0) | 2022.04.27 |
[Spring] @NoArgsConstructor, @RequiredArgsConstructor, @RequiredArgsConstructor (0) | 2022.03.30 |
[Spring] @RequestParam, @RequestBody, @ModelAttribute์ ์ฐจ์ด (1) | 2022.03.28 |
[Spring] logging ์ ๋ํด ์์๋ณด์ (1) | 2022.03.21 |
๋๊ธ