Open Chris940915 opened 3 years ago
새로운 값 타입을 직접 정의해서 사용할 수 있으며, JPA에서는 이것을 Embedded type 이라고 한다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
// 근무 기간
@Temporal(TemporalType.DATE)
Date startDate;
@Temporal(TemporalType.Date)
// 집 주소
private String city;
private String street;
private String zipcode;
}
이렇게 Entity에 상세한 데이터를 그대로 갖고있는 것은 객체지향적이지 않고 응집력을 떨어뜨린다. 대신, 근무 기간과 주소 같은 타입이 있으면 응집력을 올릴 수 있다.
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}
@Embeddable
public class Period {
@Temporal(TemporalType.DATE)
Date startDate;
@Temporal(TemporalType.DATE)
Date endDate;
public boolean isWork (Date date) {
// 값 타입을 위한 메서드를 정의 가능.
}
}
@Embeddable
public class Address {
@Column(name="city")
private String city;
private String street;
private String zipcode;
}
entity를 Parameter로 받지마라. dto를 사용해서 entity가 변해도 api spec이 변하지 않게 분리된 상태로 개발할 수 있다.
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){
Member member = new Member();
member.setName(request.getName());
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@Data
static class CreateMemberRequest {
private String name;
}
@Data
static class CreateMemberResponse {
private Long id;
public CreateMemberResponse(Long id){
this.id = id;
}
}
반환 값으로 Entity 를 하게 되더라도 Entity가 변할 때, API spec에 영향을 끼치게 된다.
@GetMapping("/api/v1/members")
public List<Member> membersV1() {
return memberService.findMembers();
}
@GetMapping("/api/v2/members")
public Result memberV2(){
List<Member> findMembers = memberService.findMembers();
List<MemberDto> collect = findMembers.stream()
.map(m -> new MemberDto(m.getName()))
.collect(Collectors.toList());
return new Result(collect);
}
@Data
@AllArgsConstructor
static class Result<T> {
private T data;
}
@Data
@AllArgsConstructor
static class MemberDto {
private String name;
}
{
"data" : [
{ "name" : ...
},
...
]
}
API spec과 DTO가 1:1이 되서 DTO에 노출할 것만 설정한다.
entity 안에 놓기 시작하면 끝이 없다.
uWSGI (Web Server Gateway Interface)
nginx와 Flask 앱 중간에서 미들웨어 역할. 웹 서버와 웹 어플리케이션이 어떤 방식으로 통신하는가에 관한 인터페이스. 웹 서버와 어플리케이션 간의 소통을 정의해 어플리케이션과 서버가 독립적으로 운영될 수 있게 돕는다.
Nginx
동시접속 처리에 특화된 웹 서버 프로그램으로 트래픽이 많은 웹 사이트의 확장성을 위해 설계된 비동기 이벤트 기반의 웹 서버 소프트웨어.