문제현상

JDBC를 이용해서 Database로 연결을 하려고 하는데, 아래와 같은 에러가 발생한다.

 

Communication link failure

The last packet successfully received from the server was 0 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.

The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.

 

 

문제원인

접속하려는 mysql 데이타베이스의 SSL설정의 기본값이 true인 경우, 접속하려는 클라이언트가 ssl로 접속하지 않고, ssl이 아닌 일반적인 연결로 접속하기 때문에 발생한다. mysql서버쪽에서는 유효하지 않는 패킷이 넘어오는 것이 때문에 오류를 낸다고 생각하면 된다.

JDBC 접속시에 SSL연결이 아닌 일반적인 연결(물론 보안이 약함)이라고 명시적으로 설정을 하면 된다.

** SSL 이란 Secure Socket Layer의 약자로서 클라이언트와 서버가 통신을 할때 암호화를 통해서 보안을 높힌 접속을 말한다.

문제해결

JDBD연결하는 URL에 useSSL=false 를 추가하면 된다. (useSSSL은 대소문자 정확하게 입력해야 함)

그리고 DB접속관련 보안프로그램이 있다면 로그인을 한다. 

 

 

ids for this class must be manually assigned before calling save()

 

error 발생 원인은 .save() 함수를 호출하기 전에 id 값이 설정되어 있어야 한다는 것. pk가 2개인 테이블이라서 @Id를 두개 주어야하는데 1개만 주어서 생긴 에러다.

단순히 @Id 어노테이션만 추가를 한다면 아래와 같은 에러를 맞닥드릴 것이다. 

[com.program.test.TestVo] does not define an idclass ... 

 

위의 방법을 해결하려면 2가지 방법이 있다. 

 

복합키를 구성 하기 위한 필수 조건이 있다.

  1. @EmbeddedId or @IdClass 의 annotation을 붙여야한다.
  2. public 의 no-args constructor 가 있어야 한다.
  3. Serializable 를 implement 받아야 한다.
  4. equals() 와 hashCode() method를 override해야 한다. (Id Class도)
    • (복합키의 일부 컬럼에 @GeneratedValue는 사용하지 못한다. 고 나와있지만 실제로 TEST 시 사용 가능한 경우도 있었다. )
@Entity
@Getter @Setter
@EqualsAndHashCode // 필수
@NoArgsConstructor
@AllArgsConstructor
@IdClass(UsersId.class) // UsersId라는 식별자 클래스에 @Id 속성이 다 있어야 한다.
public class Users implements Serializable {

 

 

IdClass를 만들어주고 Vo에 위와같이 명시해준다. 

 

 

 

idClass를 만들때 주의점 

@IdClass의 Class 항목들에 모두 @Column을 설정해 주지않으면

Could not set field value by reflection 에러를 볼 수있음.. 흠..

ref: https://shinsunyoung.tistory.com/45

public class UserId implements Serializable {

    @Column(name = "seq")
    private Long userSeq;
    @Column(name = "id")
    private String userId;

}

 

 

 

 

 

 

ref) https://kha0213.github.io/jpa/jpa-composite-key/

 

JPA Composite Primary Key

JPA Composite Primary Key JPA에서 Primary Key가 단일 키 일때는 @ID annotation으로 쉽게 가능하였다. 하지만 실무에서는 복합키인 경우도 많고 JPA에서는 이 기능을 지원하기 때문에 학습해 보았다. 크게 두

kha0213.github.io

 

 

원인

하나의 세션(런타임) 동안 동일한 PK 의 엔터티가 두개 이상 존재할 때 발생한다.

Entity 쪽 컬럼에 값이 유일해질 수 있도록 컬럼에 @Id 추가 해야한다. 

A테이블에서 B테이블로 배치 insert 를 짜는 중에 생긴 오류로, A테이블의 pk와 B테이블의 pk로 @Id를 주니 해당에러가 넘어갔다. 

일반적으로는 동일한 PK 의 엔터티를 2회 이상 조회해도 a == b 가 되어 문제되지 않지만, 코드가 복잡해지면 a != b 인 상태가 되고 예외를 발생시킨다.

해결책

가장 좋은 방법은 하나의 엔터티는 한번만 조회하는것이 가장 좋다.

하지만 그렇게 하지 못할 경우 간단한 방법은 아래와 같이 compareTo() 를 구현해 주는 것이다.

하지만 이 방법은 JPA 에서 보장하던 영속성을 스스로 깨는 방법이고, a, b 두개의 엔터티에 서로 다른 업데이트가 발생했을 때, 어떤 내용이 저장되는지를 예측할 수 없어, 지양되어야 할 방법입니다.

 

 

작업순서.... 

1.JAVA설치, 환경변수 설정 2.STS설치, 3.SpringBoot설치 4.DB설정잡기

 

 

1.JAVA설치

 

개발환경은 JDK 8위에서 설정함

https://www.oracle.com/java/technologies/downloads/#java8-mac

오라클 계정으로 로그인해서 다운받는다.  

 

 

추가) brew 로 설치해보기. 

더보기

1. 업데이트 확인

brew update

2. 패키지 추가 

brew tap adoptopenjdk/openjdk

 

3. 설치가능한 jdk보기 

brew search jdk

4. 설치 

brew install --cask adoptopenjdk11

 

이 순서대로 해야하는데, 2번에서 막힘.. 아래처럼 키체인 인증번호를 입력하라고 나옴. 

Mac용 키체인이란 무엇인가? 

https://support.apple.com/ko-kr/guide/keychain-access/kyca1083/mac

 

Mac용 키체인 접근이란 무엇입니까?

Mac에서 키체인을 사용하여 암호 및 다른 중요한 정보를 저장할 수 있습니다.

support.apple.com

키체인 Github 인증 방법!  

https://kinggrmoon.tistory.com/55

 

 

환경변수 설정 

Terminal 켜고 ls -al로 파일목록 확인 

cd /Library/Java/JavaVirtualMachines

 

 

2. STS 설치

 

3. Gradle project import 

 

 

4. DB설정잡기 

+ Recent posts