본문 바로가기
IT 서비스/시퀀스

트러블 슈팅 - Project의 bookmarkCount 컬럼이 null로 초기화됨

by agong이 2025. 5. 29.

🚨문제

프로젝트 북마크등록 관련 기능에서 다음과 같은 오류가 발생하였습니다.

"런타임 오류 발생: Cannot invoke "java.lang.Integer.intValue()" because "this.bookmarkCount" is null"

 

Project의 컬럼값인 bookmarkCount가 null이라는 것입니다. 

하지만 DB에 저장할때 다음과 같이 0으로 초기화 되도록 구현되어있었습니다.

@Column(columnDefinition = "INT DEFAULT 0")
private Integer bookmarkCount;

 

그럼에도 불구하고 Project가 생성될때 bookmarkCount는 null로 저장되었습니다. 그러다보니 북마크를 등록할때도 처음 bookmarkCount에1을 증가시킬때 오류가 다음과 같은 오류가 발생했던 것이었습니다.

 

그 원인은 바로 다음과 같은 특징 때문입니다. 

1. JPA는 Java 객체 상태를 기준으로 SQL을 생성합니다.   

2. Entity 객체를 생성할 때 해당 필드를 명시하지 않으면 명시적으로 null이 저장됩니다.

3. @Column(columnDefinition = "INT DEFAULT 0" 은 DB에 INSERT 시, 해당 필드를 명시하지 않았을 때만 기본값 0이 저장되게 됩니다. 

즉, 해당 필드를 명시하지 않았을 때만 0으로 저장되지만, 명시적으로 null을 전달하였기 때문에 0으로 초기화 되지 않은것입니다.

 

실제 코드로 살펴보면 다음과 같습니다.

public static Project fromProjectInput(ProjectInputDTO projectInputDTO, MemberEntity memberEntity){
        return Project.builder()
                .title(projectInputDTO.getTitle())
                .projectName(projectInputDTO.getProjectName())
                .category(projectInputDTO.getCategory())
                .article(projectInputDTO.getArticle())
                .writer(memberEntity)
                .build();
    }

 

다음과 같이 Project Entity를 생성할 때, 별도로 bookmarkCount를 초기화 하지 않을 경우 JPA는 null로 초기화합니다.

이렇게 저장된 Project를 저장할때 JPA가 DB에 null을 전달해버리면, DB의 Default는 동작하지 않게 되는 것입니다. 

( 아무것도 전달하지 않아야  @Column(columnDefinition = "INT DEFAULT 0" 동작하지만 null을 전달했음. DB는 "명시적으로 null이 들어왔으니 기본값 적용 안함"이라고 판단 )

 

해결

public static Project fromProjectInput(ProjectInputDTO projectInputDTO, MemberEntity memberEntity){
        return Project.builder()
                .title(projectInputDTO.getTitle())
                .projectName(projectInputDTO.getProjectName())
                .category(projectInputDTO.getCategory())
                .article(projectInputDTO.getArticle())
                .writer(memberEntity)
                .bookmarkCount(0) //추가
                .build();
    }

 

 

bookmarkCount도 0으로 초기화 해주었습니다. JPA를 사용할때는 DB에 맡기는 것이 아닌, 객체로서 초기화하고 관리하는것이 예상치 못한 오류를 막을 수 있기 때문에 더 바람직한것 같습니다.

댓글