• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

MemberServiceIntegrationTest 오류 질문드립니다.

23.01.29 23:46 작성 조회수 189

0

antlr.NoViableAltException: unexpected token:generatedAlias0

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: generatedAlias0 near line 1, column 8 [select generatedAlias0 from...]

이 부분에서 계속 에러가 뜨는데 이유를 모르겠어서 질문드려요!

참고로 이와 비슷한 문의 글도 인프런과 stackoverflow에서 봤지만, 마땅한 오타가 없어서 여기에 글 올립니다!

 

// MemberServiceIntegrationTest

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import org.springframework.transaction.annotation.Transactional;
import with.younghan.kim.domain.Member;
import with.younghan.kim.repository.MemberRepository;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {

  @Autowired MemberService memberService;
  @Autowired MemberRepository memberRepository;

  @Test
  void 회원가입() {
    //given
    Member member = new Member();
    member.setName("spring100");

    //when
    Long saveId = memberService.join(member);

    //then
    Member findMember = memberService.findOne(saveId).get();
    assertThat(member.getName()).isEqualTo(findMember.getName());
  }

  @Test
  public void 중복_회원_예외() {
    //given
    Member member1 = new Member();
    member1.setName("spring");

    Member member2 = new Member();
    member2.setName("spring");

    //when
    memberService.join(member1);
    IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
  }

}

 

// MemberService

import org.springframework.transaction.annotation.Transactional;
import with.younghan.kim.domain.Member;
import with.younghan.kim.repository.MemberRepository;

import java.util.List;
import java.util.Optional;

@Transactional
public class MemberService {

  private final MemberRepository memberRepository;


  public MemberService(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
  }

  /**
   * 회원 가입
   */
  public Long join(Member member) {

    validateDuplicateMember(member); //중복 회원 검증
    memberRepository.save(member);
    return member.getId();
  }

  private void validateDuplicateMember(Member member) {
    memberRepository.findByName(member.getName())
            .ifPresent(m -> {
              throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
  }

  /**
   * 전체 회원 조회
   */
  public List<Member> findMembers() {
    return memberRepository.findAll();
  }

  public Optional<Member> findOne(Long memberId) {
    return memberRepository.findById(memberId);
  }
}

 

// JpaMemberRepository

import with.younghan.kim.domain.Member;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

public class JpaMemberRepository implements MemberRepository {

  private final EntityManager em;

  public JpaMemberRepository(EntityManager em) {
    this.em = em;
  }

  @Override
  public Member save(Member member) {
    em.persist(member);
    return member;
  }

  @Override
  public Optional<Member> findById(Long id) {
    Member member = em.find(Member.class, id);
    return Optional.ofNullable(member);
  }

  @Override
  public Optional<Member> findByName(String name) {
    List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
            .setParameter("name", name)
            .getResultList();
    return result.stream().findAny();
  }

  @Override
  public List<Member> findAll() {
    return em.createQuery("select m from Member m", Member.class)
            .getResultList();
  }
}

 

// Member

import javax.persistence.*;

@Entity
public class Member {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private String name;

  public Long getId() { return id; }

  public void setId(Long id) { this.id = id; }

  public String getName() { return name; }

  public void setName(String name) { this.name = name; }
}

답변 1

답변을 작성해보세요.

0

OMG님의 프로필

OMG

2023.01.30

안녕하세요. 조준형님, 공식 서포터즈 OMG입니다.

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요


감사합니다.

amoeba2525님의 프로필

amoeba2525

질문자

2023.01.30

링크 공유드립니다!

amoeba2525님의 프로필

amoeba2525

질문자

2023.02.01

혹시 피드백 받을 수 있을까요?

OMG님의 프로필

OMG

2023.02.02

프로젝트 코드 확인해봤습니다.

우선 동일한 문제가 발생하여 다음과 같은 이유인지 확인해보았습니다.

1.코드오류(오타 등)

2.build.gradle관련 오류

3.프로젝트 폴더 자체의 오류(기타 설정이 적용되었는지,패키지 경로 등)

4.db테이블 오류

 

우선 1,2는 확실히 아닙니다.

3번 오류 혹은 4번 오류로 예상하여 프로젝트를 새로 만들고 강의와 동일하게 했을 시 문제는 없었습니다.(application.properties만 수정)

image

우선 아래 프로젝트를 실행해서 확인해주세요.

https://drive.google.com/file/d/1lsPpwvWC3fTBuH8KqeO1iFxBIj8Ha37S/view?usp=sharing

동일한 문제가 발생한다면 4번 예상인 테이블 오류로 예상되며,

강의를 참고하여 새로운 db를 만들어서 확인해주세요(test.mv.db 가아닌 test2.mv.db와 같이)