인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ekfrrns91님의 프로필 이미지
ekfrrns91

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 기능 테스트

테스트 시 java: class, interface, or enum expected 발생

작성

·

6.4K

0

안녕하세요, 질문이 있습니다. 

 

MemberServiceTest 작동 시, 

D:\Workspace\jpashop\src\main\java\jpabook\jpashop\domain\Address.java

java: class, interface, or enum expected

라는 오류가 발생하면서, Address.java 파일이 켜집니다. 

 

이하 MemberService.java, 

MemberServiceTest.java, 

Address.java 파일과

프로젝트 구조트리입니다.

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor //final 이 붙은 필드만 생성자 만듦
public class MemberService {

private final MemberRepository memberRepository;

//생성자 주입 (생성자가 하나면 @Autowired 생략 가능)
// public MemberService(MemberRepository memberRepository) {
// this.memberRepository = memberRepository;
// }

/**
* 회원가입
* */
@Transactional //기본값은 readOnly = false
public Long join(Member member) {

validateDuplicateMember(member); //중복 회원 검증
memberRepository.save(member); //영속성 컨텍스트에 persist() 되면, 그 키가 엔티티의 PK 값이다.
return member.getId();
}

private void validateDuplicateMember(Member member) {
//여기에 더해서 멀티 Thread 환경을 고려해, DB name unique constraint 를 걸어주는 게 좋다.
List<Member> findMembers = memberRepository.findByName(member.getName());

//또는 세보고 크기가 0이상이면 exeption으로 해도 됨
if(!findMembers.isEmpty()){
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
}

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

public Member findOne(Long memberId) {
return memberRepository.findOne(memberId);
}
}

 

package jpabook.jpashop.service;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.repository.MemberRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.junit.Assert.*;

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

@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;

@Test
public void 회원가입() throws Exception {
//Given
Member member = new Member();
member.setName("kim");
//When
Long saveId = memberService.join(member);
//Then
assertEquals(member, memberRepository.findOne(saveId));
}

}

 

package jpabook.jpashop.domain;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Embeddable;

@Embeddable
@Getter
public class Address {

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

/* 값타입 : 변경불가능하게 설계해야 함.
* 따라서 @Setter 는 제거하고, 모든 값을 초기화하는 생성자를 만들어준다.
*
* @Embeddable : JPA 스펙상에서 이 타입은 기본생성자가 필요함(리플랙션 할 때 필요)
* 다만 public 이면 아무데서나 가져 쓸 수 있으므로 protected 로 설정
* */
protected Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}

}

 

강의안 코드를 복붙해봐도 계속 오류가 발생해서 답답하네요. 

그래도 강의 열심히 듣고있습니다. 좋은 하루 보내세요!

답변 2

0

ekfrrns91님의 프로필 이미지
ekfrrns91
질문자

사용하는 곳도 다 강의안대로 복붙했는데 오류가 계속 떴습니다.

Address.java 파일을 아예 삭제하고 다시 만드니 잘 동작되었습니다. 

뭔지는 잘 모르겠지만 해당 파일 자체의 문제였던 것 같습니다. ㅠㅠ 

감사합니다. 

0

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

2가지가 의심됩니다.

1. 괄호 갯수 관련

올리신 코드 내에서는 괄호 문제는 없어보이나, Address 클래스를 사용하는 코드 쪽에서 문제가 발생하지 않나 예상합니다.

class, interface or enum expected
이 메시지의 의미는 '키워드 class 나 interface 또는 enum가 없다.' 이지만, 보통 괄호 '{' 또는 '}'의 개수가 일치하지 않는 경우에 발생한다. 열린 괄호 '{'와 닫힌 괄호 '}'의 개수가 같은지 확인하자
참고) https://java.ihoney.pe.kr/84

 

2. 프로젝트 경로

이전까지 문제가 없었다면 아닐 확률이 높으나

스프링 프로젝트, JDK, 인텔리제이(이클립스) 등은 C드라이브에 위치하지 않을 경우

간혹 문제가 발생하는 경우가 있으니 C드라이브로 옮겨서 확인 부탁드립니다.

테스트 후 결과를 공유해주세요 :)



감사합니다.

ekfrrns91님의 프로필 이미지
ekfrrns91

작성한 질문수

질문하기