JPA 활용편 - 웹 계층 개발 1

Stella·2022년 5월 10일
0

Java

목록 보기
12/18

Member entity를 안쓰고 MemberForm을 만든 이유:

  • 가지고 있는 field가 서로 다름.
  • validation을 entity에 추가하면 점점 entity class가 지저분해짐
  • controller에서 화면으로 넘어오는 validattion과 실제 domain에서 원하는 validation이 다를 수 있음.
  • 화면에 맞는 form data를 만들어서 데이터를 받음.
  • 단순하면 entity를 바로 써도 되지만, 실무에서는 요구사항이 단순하지않아서 그럴 일 없음.
  • Entity를 form으로 쓰면, entity가 화면을 처리하기 위해 기능이 점점 증가되면서 화면 종속적으로 변하고 entity가 지저분해짐. -> 유지보수 어려워짐
  • Entity는 최대한 순수하게 유지시켜야함. 핵심 로직에 대한 Dependency만 있고 다른 dependency는 없도록 처리.
  • 화면에 맞는 로직은 form객체나 dto 사용.

MemberForm

@Getter
@Setter
public class MemberForm {

    @NotEmpty(message = "회원 이름은 필수 입니다")
    private String name;

    private String city;
    private String street;
    private String zipcode;
}

MemberController

@PostMapping("/members/new")
    public String create(@Valid MemberForm form, BindingResult result){

        if(result.hasErrors()){
            return "members/createMemberForm";
        }
        Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());

        Member member = new Member();
        member.setName(form.getName());
        member.setAddress(address);

        memberService.join(member);
        return "redirect:/";
    }

API 설계 시 Entity 외부로 반환 하면 절대 안됨!

템플릿 엔진의 경우

  • 템플릿 엔진에서 랜더링을 할 때는 서버안에서 기능이 돌기 때문에 entity를 그래도 전달해도 괜찮음. 서버내에서 내가 원하는 정보만 출력하기 때문에!
  • 그래도 entity를 그대로 뿌리기 보다는 dto로 변환해서 화면에 꼭 필요한 데이터만 가지고 출력하는 방법 추천.

MemberController

   @GetMapping("/members")
    public String list(Model model){
        // member entity를 그대로 뿌리기 보다는 dto로 변환해서 화면에 꼭 필요한 데이터만 가지고 출력하는 방법 추천
        List<Member> members = memberService.findMembers();
        model.addAttribute("members",members);
    }

API의 경우

- API 설계 시 Entity 그대로 전달하면 안된다!! 이유불문 entity 넘기면 안됨!! 외부반환금지!

Member(수정 전)

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name="member_id")
    private Long id;

    private String name;

    @Embedded 
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

Member(수정 후)

@Entity
public class Member {

    @Id @GeneratedValue
    @Column(name="member_id")
    private Long id;

    private String name;
    private String password;

    @Embedded 
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}
  • 만약 Entity를 그대로 반환하는데, 위의 경우 처럼 password field가 추가되면 문제점 2가지.
    1. password 그대로 노출.
    2. API 스펙이 변함. entity에 필드를 추가했는데 api 스펙이 변함->불안정한 api 스펙이 됨.

상품 수정

  • 실무에서 id를 조심해야함. 누군가 인위적으로 id 조작해서 넘길 수 있음.
  • 보안상 취약하기 때문에 user가 아이템에 대한 권한이 있는지 확인하기.
profile
Hello!

0개의 댓글