11월 27일 개발일지 (Jpa와 MariaDb, 그리고 LocalDateTime)

주의

이 문건은 과거 Hexo 블로그 (2017-11-27) 에서 이동된 문서입니다.

시간이 지남에 따라 최신 기술과 다를 수 있으니 주의 바랍니다.


삽질만 6시간…실화임?

지금 생각해보면 하도 어이가 없어서 이 포스팅을 쓰기도 부끄럽습니다만…

(제 무지의 깊이가 상당히 깊다는 것도…반성의 의미로 작성하는 글)

오늘 봉착한 문제는 이것입니다.

데이터베이스에 값이 정상적으로 등록이 되지 않는 문제

이렇게 보니 정말 심플한 문제로 보일 것입니다.

좀 더 자세하게 들어가서 보자면…

Spring Boot 프로젝트의 Jpa를 사용하여 데이터베이스에 값을 넣는데 계속 문제가 발생하였습니다.

이렇게만 봐도 설정을 잘못했거나 미숙한 초보의 실수(물론 초보의 실수..)라 보이겠지만…

오늘의 실수와 교훈에 대해 시작하겠습니다.


문제와 원인 그리고…

문제의 DB 테이블은 다음과 같습니다.

CREATE TABLE `account` (
  `idx` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `pw` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `create_date` timestamp NOT NULL,
  `email` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `type` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `group` varchar(60) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `update_date` timestamp NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

그리고 Entity객체는 다음과 같이 구성되어 있습니다.

@Entity
@ToString
@Accessors(chain = true)
@Getter @Setter
public class Account {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int idx;

    private String id;

    private String pw;

    private LocalDateTime createDate;

    private String email;

    private String phone;

    private String userType;

    private String userGroup;

    private LocalDateTime updateDate;
}

그리고 jpa에서 데이터가 추가되는 로직은 아래와 같습니다.

accountRepo.save(
                new Account()
                        .setId("admin")
                        .setPw(shaSecurityService.encryptData4SHA("admin"))
                        .setCreateDate(LocalDateTime.now())
                        .setEmail("admin@admin.com")
                        .setPhone("000-000-0000")
                        .setUserType("admin")
                        .setUserGroup("관리자")
                        .setUpdateDate(LocalDateTime.now())
        );

이 구문을 수행할 때 에러가 발생하였습니다.

에러 구문은 다음과 같습니다.

2017-11-27 14:25:08 ERROR :[SqlExceptionHelper.java]logExceptions(129) :
(conn:33312) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version
for the right syntax to use near
'group, id, phone, pw, type, update_date) values ('2017-11-27 14:25:08.67', 'admi' at line 1

Query is: insert into account (create_date, email, group, id, phone, pw, type, update_date) values (?, ?, ?, ?, ?, ?, ?, ?),
parameters ['2017-11-27 14:25:08.67','admin@admin.com','관리자','admin','000-000-0000','c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a'
,'admin','2017-11-27 14:25:08.67']

에러에서는 ‘admi’ at line 1 이 부분의 문제로 보고 제가 쿼리를 주는 Entitiy 부분의 문제인지도 확인하였지만 아니었습니다.

당췌 어디가 문제인지를 찾다가 하이버네이트의 SQL 로그를 자세히 확인해보기로 하였습니다.

그리고 원인을 찾게 된 것은 다음과 같았습니다…

데이터베이스에 테이블을 지우고, JPA에서 직접 테이블을 생성을 해보는 것을 시도하던 도중

group` varchar(60) CHARACTER SET utf8 COLLATE utf8unicodeci NOT NULL DEFAULT ”

특수 이름을 사용한 경우에 발생하는 문제였던 것이었습니다…

Stackoverflow에서 찾은 내용입니다.


처참한 결과…

결국 테이블의 컬럼명을 바꿈으로써 문제를 해결하였습니다.

혹시 주니어 개발자 또는 초급 개발자의 경우 혹시 이런 문제가 발생한 경우 이것을 보고 도움이 되셨으면 합니다…

저처럼 시간을 많이 허비하지 않았으면 합니다…


Written by@MHLab
로또는 흑우집합소 🎲
와인관리, 시음노트, 셀러관리는 마와셀 🥂

🫥 My Service|  📜 Contact|  💻 GitHub