-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
마지막 테스트에서 제약조건 관련 오류 발생합니다.
21.11.28 21:21 작성 조회수 1.08k
0
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
답변을 작성해보세요.
6
1
OMG
2021.11.28
안녕하세요. sjshine5897님, 공식 서포터즈 OMG입니다.
ddl.sql을 강의와 동일하게 작성하셨나요?
동일한 강의도 아니고, 완전히 같은 상황은 아닌 것 같지만 에러 이유는 아래와 동일할 것으로 예상되는데
https://www.inflearn.com/questions/208784
Member 엔티티와 MemberRepository, JpaMemberRepository 클래스를 비교해보신 후 해결이 안될 경우 해당 클래스를 올려주세요.
가능하면 save 메서드를 호출하는 테스트 코드도 보여주시면 해결에 도움이 될 것 같습니다.
감사합니다.
sjshine5897
질문자2021.11.28
넵 ddl도 확인 했습니다. 혹시 몰라서 h2에서 다시 실행도 해보았습니다.
남겨주신 링크와 달리 올바른 쿼리를 호출한걸로 보입니다ㅜ
Hibernate: select member0_.id as id1_0_, member0_.name as name2_0_ from member member0_ where member0_.name=?
Hibernate: insert into member (id, name) values (null, ?)
2021-11-28 21:59:43.225 WARN 19160 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23502, SQLState: 23502
2021-11-28 21:59:43.225 ERROR 19160 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : NULL not allowed for column "ID"; SQL statement:
아래 코드 첨부하였습니다.
MemberServiceIntegrationTest
ackage hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.JdbcMemberRepository;
import hello.hellospring.repository.MemberRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
@SpringBootTest
@Transactional
public class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
void join() {
//given
Member member = new Member();
member.setName("spring");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get() ;
assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void dupMemberException(){
//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("이미 존재하는 회원입니다.");
/*try{
memberService.join(member2);
fail();
}catch(IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}*/
}
}
MemberService
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
@Transactional
public class MemberService {
// private final MemberRepository memberRepository = new MemoryMemberRepository();
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
/*
* 회원 가입
*/
@Transactional
public Long join(Member member){
// 같은 이름이 있는 중복 회원 X
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
package hello.hellospring.repository;
import hello.hellospring.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();
}
}
MemberRepository
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
Member
package hello.hellospring.domain;
import javax.persistence.*;
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name="name")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
OMG
2021.11.28
요청드린 내용에 대한 코드 첨부 감사합니다.
코드 확인해보니 큰 문제는 없어보이는데,
application.properties 의
ddl-auto=none으로 되어있을 것 같은데
아래와 같이 create로 바꿔서 다시 한번 확인부탁드립니다.
spring.jpa.hibernate.ddl-auto=create
0
sjshine5897
질문자2021.11.28
Member.java에서
IDENTITY 대신 SEQUENCE로 진행하니 테스트는 통과하네요,,
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private Long id;
H2 DB 다운받았을 때 윈도우 인스톨러로 진행한게 영향이 있을까요?
0
sjshine5897
질문자2021.11.28
강의에서 테이블을 미리 생성하므로 ddl-auto : none으로 세팅하자고 한 걸로 기억합니다.
create로 변경해도 동일합니다.
SpringConfig는 아래와 같이 작성했습니다.
ckage hello.hellospring;
import hello.hellospring.repository.*;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
private final DataSource dataSource;
@PersistenceContext
private final EntityManager em;
@Autowired
public SpringConfig(DataSource dataSource, EntityManager em){
this.dataSource=dataSource;
this.em = em;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
// return new MemoryMemberRepository();
// return new JdbcMemberRepository(dataSource);
// return new JdbcTemplateMemberRepository(dataSource);
return new JpaMemberRepository(em);
}
}
혹시나 DB가 문제일까 싶어 jdbcTemplate과 @Commit으로 확인해봤는데 DB는 문제 없는 것 같습니다.
Jpa 에러 로그
OMG
2021.11.28
문제 발생이 의심되는 코드에서는 특이점이 보이지 않네요..
아래 링크를 참고하여 프로젝트를 압축하여 링크 공유해주시면 확인 후 답변 드리겠습니다.
링크 추출 전 액세스 권한이 출력 되지 않도록 공개 범위 설정을 반드시 확인해주세요. (링크에서 확인하는 방법도 있으니 참고부탁드립니다.)
https://bit.ly/3fX6ygx
sjshine5897
질문자2021.11.28
혹시 SDK가 원인이 될 수 있을까요?
C:\Users\sjshi\.jdks\corretto-11.0.13\bin\java.exe -ea -~~
OMG
2021.11.28
jdk 버전만 11이라면 큰 문제가 되지 않을 것 같습니다. 그동안 제가 본 질문,답변 내역에서 jdk 제공사에 따른 문제를 본적이 없으나
혹시 모르니 제가 사용하는 open-jdk11로 확인해봐야 할것같습니다.
sjshine5897
질문자2021.11.28
드라이브에 업로드한 링크 공유드립니다.
https://drive.google.com/file/d/1ihB2BTdmGtHdSEeU5TqwZ-FLDa7FZlyp/view?usp=sharing
답변 4