인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

ekfrrns91님의 프로필 이미지

작성한 질문수

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

회원 기능 테스트

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

작성

·

6.5K

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

OMG님의 프로필 이미지

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

2가지가 의심됩니다.

1. 괄호 갯수 관련

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

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

 

2. 프로젝트 경로

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

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

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

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



감사합니다.