inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

회원 등록 API

v1에서 v2로 바꿀때 postman이 동작하질 않습니다

424

chl.cken

작성한 질문수 19

0

안녕하세요 v1에서 v2로 바꿀때 postman이 동작하질 않습니다

엔티티를 조금 제 입맛에 맞게 변경했는데 v1은 도작하나 v2는 동작하질 않아서.. 이게 왜 이런 오류가 나는지 모르겠습니다

 

[MemberApiController]

package mkyu.loginApi.domain.api;

import com.fasterxml.jackson.databind.annotation.JsonValueInstantiator;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import mkyu.loginApi.domain.member.Member;
import mkyu.loginApi.domain.service.MemberService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequiredArgsConstructor
public class MemberApiController {

    private final MemberService memberService;

    //RequestBody는 json의 데이터를 Member로 다 넣어줌, 엔티티를 파라미터로 넣으면 안됨/ 수정, sns로그인 때문에 1:1이 안되서 오류남
    @PostMapping("/api/v1/members")
    public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
        Long idx = memberService.join(member);
        return new CreateMemberResponse(idx);
    }
    @PostMapping("/api/v2/members")
    public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {

        Member member = new Member();
        member.setName(request.getName());

        Long idx = memberService.join(member);
        System.out.println(idx);
        return new CreateMemberResponse(idx);
    }
    //
    @Data
    static class CreateMemberRequest {
        private String name;
    }

    @Data
    static class CreateMemberResponse {
        private Long idx;

        public CreateMemberResponse(Long idx) {
            this.idx = idx;
        }
    }


}

[Member]

package mkyu.loginApi.domain.member;

import lombok.*;
import mkyu.loginApi.domain.BaseTimeEntity;
import javax.persistence.*;
import javax.validation.constraints.NotEmpty;

@Table(name = "MEMBER")
@Getter
@Setter
@NoArgsConstructor
@Entity
@AllArgsConstructor
@Builder
public class Member extends BaseTimeEntity {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_idx")
    private Long idx; //primary Key

//    @NotEmpty
    @Column(nullable = false, length = 30, unique = true)
    private String id;//아이디

//    @NotEmpty
    private String password;//비밀번호

//    @NotEmpty
    @Column(nullable = false, length = 30)
    private String name;//이름(실명)

//    @NotEmpty
    @Column(nullable = false, length = 30)
    private String mobile;//번호

//    @NotEmpty
    @Column(nullable = false, length = 30)
    private String email;//이메일

    @Column(length = 1000)
    private String refreshToken;//RefreshToken

    public Member(String password) {
        this.password = password;
    }

    public Member(String id, String password, String name, String mobile, String email) {
        this.id = id;
        this.password = password;
        this.name = name;
        this.mobile = mobile;
        this.email = email;
    }
}

[오류메시지]

2022-05-02 11:03:02.010 DEBUG 45809 --- [nio-8095-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/v2/members", parameters={}
2022-05-02 11:03:02.013 DEBUG 45809 --- [nio-8095-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to mkyu.loginApi.domain.api.MemberApiController#saveMemberV2(CreateMemberRequest)
2022-05-02 11:03:02.014 DEBUG 45809 --- [nio-8095-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2022-05-02 11:03:02.018 DEBUG 45809 --- [nio-8095-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [MemberApiController.CreateMemberRequest(name=l2e)]
2022-05-02 11:03:02.019 DEBUG 45809 --- [nio-8095-exec-1] o.s.orm.jpa.JpaTransactionManager        : Found thread-bound EntityManager [SessionImpl(565980721<open>)] for JPA transaction
2022-05-02 11:03:02.020 DEBUG 45809 --- [nio-8095-exec-1] o.s.orm.jpa.JpaTransactionManager        : Creating new transaction with name [mkyu.loginApi.domain.service.MemberService.join]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2022-05-02 11:03:02.033 DEBUG 45809 --- [nio-8095-exec-1] o.s.orm.jpa.JpaTransactionManager        : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@211015b3]
2022-05-02 11:03:02.036  INFO 45809 --- [nio-8095-exec-1] p6spy                                    : #1651456982036 | took 0ms | statement | connection 13| url jdbc:h2:tcp://localhost/~/test
select member0_.member_idx as member_i1_0_, member0_.created_date as created_2_0_, member0_.email as email3_0_, member0_.id as id4_0_, member0_.mobile as mobile5_0_, member0_.name as name6_0_, member0_.password as password7_0_, member0_.refresh_token as refresh_8_0_ from member member0_ where member0_.name=?
select member0_.member_idx as member_i1_0_, member0_.created_date as created_2_0_, member0_.email as email3_0_, member0_.id as id4_0_, member0_.mobile as mobile5_0_, member0_.name as name6_0_, member0_.password as password7_0_, member0_.refresh_token as refresh_8_0_ from member member0_ where member0_.name='l2e';
2022-05-02 11:03:02.041  INFO 45809 --- [nio-8095-exec-1] p6spy                                    : #1651456982041 | took 1ms | statement | connection 13| url jdbc:h2:tcp://localhost/~/test
insert into member (member_idx, created_date, email, id, mobile, name, password, refresh_token) values (default, ?, ?, ?, ?, ?, ?, ?)
insert into member (member_idx, created_date, email, id, mobile, name, password, refresh_token) values (default, NULL, NULL, NULL, NULL, 'l2e', NULL, NULL);
2022-05-02 11:03:02.041  WARN 45809 --- [nio-8095-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 23502, SQLState: 23502
2022-05-02 11:03:02.041 ERROR 45809 --- [nio-8095-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : NULL not allowed for column "EMAIL"; SQL statement:
insert into member (member_idx, created_date, email, id, mobile, name, password, refresh_token) values (default, ?, ?, ?, ?, ?, ?, ?) [23502-200]
2022-05-02 11:03:02.042 DEBUG 45809 --- [nio-8095-exec-1] o.s.orm.jpa.JpaTransactionManager        : Initiating transaction rollback
2022-05-02 11:03:02.042 DEBUG 45809 --- [nio-8095-exec-1] o.s.orm.jpa.JpaTransactionManager        : Rolling back JPA transaction on EntityManager [SessionImpl(565980721<open>)]
2022-05-02 11:03:02.042  INFO 45809 --- [nio-8095-exec-1] p6spy                                    : #1651456982042 | took 0ms | rollback | connection 13| url jdbc:h2:tcp://localhost/~/test

;
2022-05-02 11:03:02.043 DEBUG 45809 --- [nio-8095-exec-1] o.s.orm.jpa.JpaTransactionManager        : Not closing pre-bound JPA EntityManager after transaction
2022-05-02 11:03:02.043 DEBUG 45809 --- [nio-8095-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2022-05-02 11:03:02.043 DEBUG 45809 --- [nio-8095-exec-1] o.s.web.servlet.DispatcherServlet        : Failed to complete request: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
2022-05-02 11:03:02.050 ERROR 45809 --- [nio-8095-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "EMAIL"; SQL statement:
insert into member (member_idx, created_date, email, id, mobile, name, password, refresh_token) values (default, ?, ?, ?, ?, ?, ?, ?) [23502-200]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) ~[h2-1.4.200.jar:1.4.200]
	at org.h2.engine.SessionRemote.done(SessionRemote.java:611) ~[h2-1.4.200.jar:1.4.200]
	at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) ~[h2-1.4.200.jar:1.4.200]
	at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:191) ~[h2-1.4.200.jar:1.4.200]
	at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:152) ~[h2-1.4.200.jar:1.4.200]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-4.0.3.jar:na]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na]
	at com.p6spy.engine.wrapper.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:94) ~[p6spy-3.9.0.jar:na]
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:58) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:43) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3279) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3885) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:84) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:756) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:742) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
	at jdk.internal.reflect.GeneratedMethodAccessor44.invoke(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362) ~[spring-orm-5.3.19.jar:5.3.19]
	at jdk.proxy2/jdk.proxy2.$Proxy100.persist(Unknown Source) ~[na:na]
	at jdk.internal.reflect.GeneratedMethodAccessor44.invoke(Unknown Source) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) ~[spring-orm-5.3.19.jar:5.3.19]
	at jdk.proxy2/jdk.proxy2.$Proxy100.persist(Unknown Source) ~[na:na]
	at mkyu.loginApi.domain.repository.MemberRepository.save(MemberRepository.java:17) ~[classes/:na]
	at mkyu.loginApi.domain.repository.MemberRepository$$FastClassBySpringCGLIB$$cfc41407.invoke(<generated>) ~[classes/:na]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.19.jar:5.3.19]
	at mkyu.loginApi.domain.repository.MemberRepository$$EnhancerBySpringCGLIB$$e8dc9246.save(<generated>) ~[classes/:na]
	at mkyu.loginApi.domain.service.MemberService.join(MemberService.java:24) ~[classes/:na]
	at mkyu.loginApi.domain.service.MemberService$$FastClassBySpringCGLIB$$316efea1.invoke(<generated>) ~[classes/:na]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-5.3.19.jar:5.3.19]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.19.jar:5.3.19]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.19.jar:5.3.19]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.19.jar:5.3.19]
	at mkyu.loginApi.domain.service.MemberService$$EnhancerBySpringCGLIB$$b1b444be.join(<generated>) ~[classes/:na]
	at mkyu.loginApi.domain.api.MemberApiController.saveMemberV2(MemberApiController.java:34) ~[classes/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.19.jar:5.3.19]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[tomcat-embed-core-9.0.62.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.19.jar:5.3.19]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[tomcat-embed-core-9.0.62.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.19.jar:5.3.19]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.19.jar:5.3.19]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.19.jar:5.3.19]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.19.jar:5.3.19]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.19.jar:5.3.19]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.19.jar:5.3.19]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.62.jar:9.0.62]
	at java.base/java.lang.Thread.run(Thread.java:831) ~[na:na]

2022-05-02 11:03:02.052 DEBUG 45809 --- [nio-8095-exec-1] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for POST "/error", parameters={}
2022-05-02 11:03:02.053 DEBUG 45809 --- [nio-8095-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2022-05-02 11:03:02.053 DEBUG 45809 --- [nio-8095-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2022-05-02 11:03:02.054 DEBUG 45809 --- [nio-8095-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json]
2022-05-02 11:03:02.055 DEBUG 45809 --- [nio-8095-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [{timestamp=Mon May 02 11:03:02 KST 2022, status=500, error=Internal Server Error, path=/api/v2/membe (truncated)...]
2022-05-02 11:03:02.055 DEBUG 45809 --- [nio-8095-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2022-05-02 11:03:02.056 DEBUG 45809 --- [nio-8095-exec-1] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 500

감사합니다!! 

spring-boot JPA spring java

답변 1

2

David

안녕하세요. chl.cken님, 공식 서포터즈 David입니다.

Member 엔티티의 Email 필드는 nullable이 false이므로 Not Null Column입니다.

v2 api에서 Email을 요청으로부터 넘겨받지만 Member 객체의 필드에 데이터를 set해주는 것은 name만 해주네요. 그러면 당연히 Member 객체 내 Email 필드는 null일테고 이 상태로 저장하면 Not Null 관련 에러가 발생하게 됩니다.

올려주신 에러 로그 중 아래 라인을 참고해주세요.

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "EMAIL"; SQL statement

감사합니다.

0

chl.cken

답변 감사합니다^^...ㅠㅠㅠㅠㅠㅠ 아래 코드 고쳐봤습니다

@PostMapping("/api/v2/members")
    public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {

        Member member = new Member();
        member.setName(request.getName());

        Long idx = memberService.join(member);
        System.out.println(idx);
        return new CreateMemberResponse(idx);
    }

---------------------------아래처럼 수정 --------------------------
@PostMapping("/api/v2/members")
    public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {

        Member member = new Member();
        member.setName(request.getName());
        member.setEmail(request.getEmail());
Long idx = memberService.join(member); System.out.println(idx); return new CreateMemberResponse(idx); 

 

강의 관련 외 질문입니다.

0

75

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

1

95

1

BeanCreationException

0

94

3

Update 후 UpdateMemberResponse 매핑할 때

0

53

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

102

2

페이징 + 검색조건 관련해서 질문드립니다.

0

74

1

Query Dsl Q파일 질문입니다.

0

86

1

루트 쿼리라는것은

0

61

1

메서드를 분리하는 기준

0

70

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

115

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

90

2

fetch join과 영속화와 OSIV의 관계

0

90

2

Distinct 사용 전 결과에 대한 의문

0

117

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

61

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

79

2

dto 필드 속 엔티티 여부

0

60

1

뷰템플릿 사용 시

0

82

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

87

1

DTO 대신 Form 사용은 안되나요?

0

140

1

OSIV ON 상태일 때

0

98

1

fetch join VS fetch join 페이징 궁금증

0

189

2

양방향 연관관계 알아보는 법?

0

108

1

16강 17강 간단 정리 이게 맞을까요 ?

0

167

2