코드 그라데이션

shop 구현 (3) Entity, Dto, Service 계층 + QueryDsl 본문

Spring/SpringShop

shop 구현 (3) Entity, Dto, Service 계층 + QueryDsl

완벽한 장면 2023. 7. 9. 13:16

@Enumerated(EnumType.STRING)

-> Enum을 처리하기 위한 어노테이션 

그런데 기본값은 EnumType.ORDINAL => 0, 1로 이루어진 숫자.

이러면 값이 중간에 삭제되거나 순서가 바뀌거나 하면 사고난다.

 

왜 쿼리Dsl을 쓰는가?

쿼리dsl을 쓰면 쿼리문 중간에 오타 발생률이 현저히 낮아진다.

컴파일 시점에 에러를 잡아내기 때문에 그렇다.

JPQL이라면 런타임에서나 발견될만한 에러를 컴파일 단위에서 끌어내려서 먼저 발견.

 

----------------------

컴파일 에러와 런타임 에러는 모두 프로그램 개발과 실행 과정에서 발생할 수 있는 문제입니다. 그러나 둘은 서로 다른 종류의 오류이며, 발생하는 시점과 원인도 다릅니다. 컴파일 에러는 소스 코드를 컴파일하는 과정에서 발생하는 오류입니다. 컴파일러는 프로그램 코드를 기계어로 변환하기 위해 사용됩니다. 컴파일 에러는 주로 문법 오류, 타입 오류, 선언되지 않은 식별자, 잘못된 함수 호출 등과 같은 문제로 인해 발생합니다. 이러한 에러는 소스 코드를 컴파일하는 동안 발생하므로, 프로그램이 실행되기 전에 수정되어야 합니다. 컴파일 에러가 발생하면, 컴파일러는 오류 메시지를 출력하고 컴파일 과정을 중단합니다. 반면에, 런타임 에러는 프로그램이 실행되는 동안 발생하는 오류입니다. 프로그램이 컴파일되고 실행 파일로 변환된 후에 발생하는 문제입니다. 런타임 에러는 예기치 않은 상황 또는 잘못된 프로그램 동작으로 인해 발생할 수 있습니다. 일반적인 런타임 에러 유형으로는 0으로 나누기, 배열 범위 초과, 메모리 할당 오류, 잘못된 형 변환, 널 포인터 참조 등이 있습니다. 런타임 에러가 발생하면 프로그램이 강제로 종료되거나 예외가 발생합니다. 이러한 에러를 처리하는 방법은 프로그래밍 언어와 개발 환경에 따라 다를 수 있습니다. 요약하자면, 컴파일 에러는 소스 코드를 컴파일하는 동안 발생하는 오류로, 주로 문법 오류나 타입 오류 등과 관련됩니다. 이를 수정해야만 프로그램이 실행될 수 있습니다. 런타임 에러는 프로그램이 실행되는 동안 발생하는 오류로, 예기치 않은 동작이나 잘못된 상황으로 인해 발생합니다. 이러한 에러는 프로그램 실행 중에 처리되어야 합니다.

-------------

 

Service 계층

@Service
@Transactional // 트랜잭션설정 : 성공을 하면 그대로 적용 실패하면 롤백
@RequiredArgsConstructor // final 또는 @NonNull 명령어가 붙으면 객체를 자동 붙여준다.
public class MemberService implements UserDetailsService {
//SequrityConfig 들어가보면 MemberService로 설정하겠다고 아까 나와있었음


  private final MemberRepository memberRepository;

  public Member saveMember(Member member) {
    validateDuplicateMember(member);
    return memberRepository.save(member); // 데이터베이스에 저장을 하라는 명령
  }

  // 중복 회원 검사
  private void validateDuplicateMember(Member member) {
    Member findMember = memberRepository.findByEmail(member.getEmail());
    if (findMember != null) {
      throw new IllegalStateException("이미 가입된 회원입니다.");
    }
  }

  @Override
  //스프링이 제공하는 인터페이스
  public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 
    Member member = memberRepository.findByEmail(email);
    if (member == null) {
      throw new UsernameNotFoundException(email);
    }
    // 빌더 패턴
    return User.builder().username(member.getEmail())
        .password(member.getPassword())
        .roles(member.getRole().toString())
        .build();
  }
}

 

 

빌더패턴

https://www.digitalocean.com/community/tutorials/builder-design-pattern-in-java

 

Builder Design Pattern in Java | DigitalOcean

 

www.digitalocean.com

 빌더 클래스를 컴퓨터 안에 만들어놨기 때문에 클래스 안의 클래스라고 표현.

 우선, 컴퓨터와 컴퓨터빌더는 매우 연관이 깊기 때문에 안에다가 두는 것이기도 하고,

chainig도 제공(주렁주렁 달린다 => 여기서는 .으로 계속 달고 있었음.)

어떻게 이게 가능? 리턴이 자기 자신이기 때문에.

 

보면 

public User.UserBuilder username(String username) {
	Assert.notNull(username,  "username cannot be null"); 
    this.username = username;
    return this;
}

이런식으로 되어있다.

리턴이 계속 자기자신이기 때문에 .으로 계속 붙어서 갈 수 있다.

 

딱 하나 예외, 리턴타입이 다른 것은 build.

그래서 build 붙이는 순간 매듭이 지어지는 것이었다.

 

 

728x90
Comments