Chris940915 / geo_benchmark

0 stars 0 forks source link

1/3 job #10

Open Chris940915 opened 3 years ago

Chris940915 commented 3 years ago

uWSGI (Web Server Gateway Interface)

nginx와 Flask 앱 중간에서 미들웨어 역할. 웹 서버와 웹 어플리케이션이 어떤 방식으로 통신하는가에 관한 인터페이스. 웹 서버와 어플리케이션 간의 소통을 정의해 어플리케이션과 서버가 독립적으로 운영될 수 있게 돕는다.

Nginx

동시접속 처리에 특화된 웹 서버 프로그램으로 트래픽이 많은 웹 사이트의 확장성을 위해 설계된 비동기 이벤트 기반의 웹 서버 소프트웨어.

Chris940915 commented 3 years ago

@Embedded

새로운 값 타입을 직접 정의해서 사용할 수 있으며, 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;
}
Chris940915 commented 3 years ago

@RequestBody

@Valid

@Data

@RestController

@NotEmpty 필수값

lombok

Id, GeneratedValue

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;
    }
}
Chris940915 commented 3 years ago

반환 값으로 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에 노출할 것만 설정한다.

@JsonIgnore

entity 안에 놓기 시작하면 끝이 없다.

Chris940915 commented 3 years ago

n+1 문제.