DevKim

[02] Entity/table 설계 & 회원 도메인 개발 본문

Spring Boot

[02] Entity/table 설계 & 회원 도메인 개발

on_doing 2021. 7. 8. 19:11
728x90

본 포스팅엔 '김영한님의 실전 스프링 부트와 JPA 활용 1편'의 내용이 포함되어있습니다.

 

이번 실습은 연관관계의 모든 매핑관계를 다뤄보고,

Data JPA를 사용하지 않고 JPA를 사용하여 원리를 이해하고 간단한 기능을 최적화하는데에 맞춰져있다.

 

요구사항을 보고 스스로 엔티티와 테이블 설계를 하고 난 후,

영한님이 구현하신 자료들을 보고 비교해나가는 방식으로 학습을 진행 할 예정이다.


개발 순서는 다음과 같다.

 

Entity 설계 - Entity 개발 - Service,Repository 개발 - Test code 작성을 통한 검증 - 웹 계층에 적용

도메인 주도 개발(DDD)방식 사용


[ Entity & Table 설계 ]

diagram 생성 툴은 아래의 사이트를 이용했고,

실습 진행을 위해 테이블명이나 FK 명은 강의와 똑같이 변경하였다.

https://app.diagrams.net/

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software diagrams.net (formerly draw.io) is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPM

app.diagrams.net

 


[ 회원 repository 구현 ]

📌 01. 회원 구현 기능

- 회원 등록

- 회원 목록 조회

@Repository
public class MemberRepository {

    @PersistenceContext
    EntityManager em;
	
    ...

    //이름으로 회원 조회
    public List<Member> findByName(String name)
    {
        return em.createQuery("select m from Member m where m.name=:name",Member.class)
                .setParameter("name",name)
                .getResultList();
    }
}

Data JPA를 먼저 써봤던지라, JPQL이 번거롭다고 느껴지지만

복잡한 쿼리를 다뤄야하는 상황에선 어차피 JPQL을 사용해야하기 때문에 기본적인 문법들은 미리 숙지를 해두었다.

귀찮지만,, 개인적으로 직관적이어서 마음에 든다


[ 회원 service ]

- 회원가입 ( 아이디 중복 체크)

- 회원조회

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class MemberService {

    private final MemberRepository memberRepository;

    /**
     * 회원가입
     */
    @Transactional
    public Long join(Member member)
    {
        validateDuplicateMember(member); //회원 중복검증
        ...
    }

    /**
     * 중복 회원 검증
     */
    public void validateDuplicateMember(Member member)
    {
        String name = member.getName();

        List<Member> memberList = memberRepository.findByName(name);

        if(!memberList.isEmpty())
        {
            throw new IllegalStateException("이미 존재하는 회원입니다");
        }
    }

    ...

}

기능자체는 매우 단순하다.

 

여기서 눈여겨 봐야 할 부분

📌 01. readonly는 조회시에, 영속성 컨텍스트를 flush를 해주지 않고 dirty checking을 해주지 않는 등,

내부적으로 성능을 최적화해준다.

회원가입은 변경이 이루어져야하기 때문에, 따로 Transactional을 넣어줘서 readonly 속성에서 제외시켜주고,

나머지는 Transaction을 readonly로 설정해주었다.

 

📌 02. 사람들이 동시에 여러명이 같은 이름으로 회원가입하는 경우 중복검증에 있어서 문제가 될 수 있다.

실무에선 최후의 방어로 DB의 아이디를 유니크 제약조건으로 잡아줘야한다고한다.


[ 회원 기능 테스트 ]

📌 회원가입 성공 유무

- 임의로 회원 생성 후, 정상적으로 저장이 되었는지 확인

 

📌 회원가입시 중복 체크

- 중복된 회원이 발생한다면 예상대로 미리 설정해준 예외처리 발생하는지 확인

@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest
public class MemberServiceTest {

    @Autowired
    MemberRepository memberRepository;

    @Autowired
    MemberService memberService;

    @Test
    @DisplayName("회원가입")
    public void test1() throws Exception{
        //given
        Member member = new Member();
        member.setName("홍길동");
        
        //when
        Long saveId = memberService.join(member);

        //then
        assertThat(member).isEqualTo(memberRepository.findOne(saveId));
    }

   @Test(expected=IllegalStateException.class)
   @DisplayName("중복 회원 예외")
   public void test2() throws Exception{
        //given
        Member member1=new Member();
        Member member2=new Member();

        member1.setName("memberA");
        member2.setName("memberA");

        //when
        memberService.join(member1);
        memberService.join(member2);

        //then
        fail("예외 발생");
    }
}
728x90
Comments