[Spring] Maven 프로젝트 생성 + 객체 지향 코드 & MySQL 사용하기

진주·2022년 3월 22일
0

Spring

목록 보기
23/29

Maven 프로젝트 생성

F1 - Create Java Project - Maven - Maven-archetype-quickstart - 1.4 버전

패키지 명 : dev.hibernate

프로젝트 명 : jpa2

터미널에 뭐 물어보면 Enter 2번 누르면 프로젝트 생성 완료

Open 클릭하면 새로운 프로젝트로 VS code가 자동으로 폴더를 열어준다.


pom.xml 수정하기

현재는 Maven으로 만들어서 수정해야 하는 것, spring initializr를 사용하면 굳이 설정할 필요 없다.

1.7에서 1.8으로 수정

    <!-- JPA 구현체 Hibernate -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.4.10.Final</version>
    </dependency>

    <!-- MySQL JDBC Driver -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>

pom.xml의 <dependencies>내에 코드 집어 넣기


필수 파일 생성

main - 폴더 명 : resources

resources - 폴더 명 : META-INF

META-INF - 파일 명: persistence.xml 생성

persistence.sml 코드

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">

    <persistence-unit name="jpa2"> <!-- 프로젝트 이름 -->
        <properties>
            <!-- property name -->
            <!-- javax.persistence ~ : JPA 표준 속성 -->
            <!-- hiberante ~ : JPA의 구현체 중 하나인 hibernate의 전용 속성 -->

            <!-- DB와 연결하기 위한 필수 속성 -->
            <!-- MySQL 설정 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" value="1234"/>
            <!-- DB Dialect(방언) 설정(MySQL) -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />

            <!-- 옵션(선택) 속성 -->
            <!-- hiberante의 실행 과정에서 콘솔에 테이블 생성, DDL, DML 등 SQL문을 출력하도록 -->
            <property name="hibernate.show_sql" value="true"/>
            <!-- SQL 출력 형태 정렬 -->
            <property name="hibernate.format_sql" value="true"/>
            <!-- 주석문도 포함해서 출력 -->
            <property name="hibernate.use_sql_comments" value="true"/>
            
            <!-- **(중요) 애플리케이션 실행 시 DB 테이블을 자동으로 생성할 것인지 ? -->
            <!-- create: 기존에 테이블이 존재하면 삭제(drop), 테이블 새로 생성, DROP + CREATE -->
            <!-- update: DB테이블과 Entity(객체)의 맵핑(Mapping) 정보를 비교, 변경된 사항만 수정, 반영 -->
            <property name="hibernate.hbm2ddl.auto" value="create"/>

        </properties>
    </persistence-unit>
</persistence>

코드 복사 붙여넣기


model - Student.java 코드

hibernate - 폴더 명 : model 생성

model - 파일 명 : Student.java, Major.java 생성

Id, studentName 변수 선언 후 기본 생성자, Getter , Setter 생성하기

package dev.hibernate.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student {

  @Id // primary key 지정
  @Column(name="STUDENT_ID")  // DB TABLE의 COLUMN명을 STUDENT_ID로 지정
  @GeneratedValue(strategy = GenerationType.IDENTITY) 
  // key 생성 전략, MYSQL AUTO_INCREMENT 설정
  private Long Id;

  @Column(name = "STUDENT_NAME")
  private String studentName;

  public Student() {
  }

  public Student(Long id, String studentName) {
    Id = id;
    this.studentName = studentName;
  }

  public Long getId() {
    return Id;
  }

  public void setId(Long id) {
    Id = id;
  }

  public String getStudentName() {
    return studentName;
  }

  public void setStudentName(String studentName) {
    this.studentName = studentName;
  }

}

model - Major.java 코드

package dev.hibernate.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Major {

  @Id
  @Column(name="MAJOR_ID")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long Id;

  @Column(name="MAJOR_FIELD")
  private String majorName;

  public Major() {
  }

  public Major(Long id, String majorName) {
    Id = id;
    this.majorName = majorName;
  }

  public Long getId() {
    return Id;
  }

  public void setId(Long id) {
    Id = id;
  }

  public String getMajorName() {
    return majorName;
  }

  public void setMajorName(String majorName) {
    this.majorName = majorName;
  }
  
  @Override
  public String toString() {
    return "Major [Id=" + Id + ", majorName=" + majorName + "]";
  }
}

DB Table 관계 ?

  1. 방향
  2. 다중성

STUDENT : MAJOR = N : 1 (다대일 관계)
학생은 1개의 MAJOR를 갖지만, 하나의 MAJOR은 여러명의 STUDENT를 가질 수 있다.

STU는 MAJOR를 봤을 때 1개를 가질 수 있고 MAJOR는 STU를 봤을 때, N개를 가질 수 있다.

STUDENT CLASS에 MAJOR 필드가 있기 위해 추가할 코드 :

  @ManyToOne  // STUDENT와 MAJOR는 N:1 관계임을 명시하는 Annotation
  @JoinColumn(name ="MAJOR_ID")
  private Major major;
  
  public Major getMajor() {
    return major;
  }

  public void setMajor(Major major) {
    this.major = major;
  }

MAJOR_ID는 MAJOR TABLE에서 Primary key이고,
@JoinColumn(name ="MAJOR_ID")를 통해 STUDENT CLASS에 MAJOR_ID를 Foriegn key로 넘긴다. (이해 제대로 안됐다 ㅠㅠ)

참고) STUDENT : MAJOR = N : M 는 교차 엔티티를 구성해서 해결한다.


1) 🍞 App.java - 객체 지향적 코드

package dev.hibernate;

import dev.hibernate.model.Major;
import dev.hibernate.model.Student;

public class App 
{
    public static void main( String[] args )
    {
        Student student1 = new Student(1L, "Doo");
        Student student2 = new Student(2L, "Hyun");
        
        Major major = new Major(1L, "컴퓨터 공학");

        student1.setMajor(major);
        student2.setMajor(major);

        // student1이 속한 학과 조회
        Major foundMajor = student1.getMajor(); // 컴퓨터 공학
        System.out.println(foundMajor);

    }
}

F5눌러서 확인하기


2) 🍩 MySQL 로 동일한 결과 도출하기


-- STUDENT TABLE 생성
CREATE TABLE STUDENT(
  STUDENT_ID INT(5) unsigned NOT NULL AUTO_INCREMENT,
  MAJOR_ID INT(5) unsigned, -- 외래키 설정X, 일반 키
  STUDENT_NAME VARCHAR(255),
  PRIMARY KEY (STUDENT_ID)
);

-- MAJOR TABLE 생성
CREATE TABLE MAJOR(
  MAJOR_ID INT(5) unsigned NOT NULL AUTO_INCREMENT,
  MAJOR_NAME VARCHAR(255),
  PRIMARY KEY(MAJOR_ID)
);

-- MAJOR_ID를 FOREIGN KEY로 설정하기 위한 QUERY
ALTER TABLE STUDENT
ADD CONSTRAINT FK_STUDENT_MAJOR
FOREIGN KEY (MAJOR_ID)  
REFERENCES MAJOR(MAJOR_ID);

-- AUTO_INCREMENT에 의해 MAJOR_ID가 자동으로 설정된다.
-- MAJOR TABLE에 DATA 집어넣기
INSERT INTO MAJOR(MAJOR_NAME) VALUES ("CS");

-- STUDENT TABLE에 DATA 집어넣기
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Joo");
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Bong");

-- 외래키 사용, JOIN
SELECT M.*, S.STUDENT_NAME 
FROM STUDENT S, JOIN MAJOR M ON S.MAJOR_ID = M.MAJOR_ID
WHERE S.STUDENT_ID = 1;


-- 오류 해결을 위한 코드였지만,, ㅎ
ALTER TABLE STUDENT CONVERT TO CHARSET utf8;
ALTER TABLE MAJOR CONVERT TO CHARSET utf8;

ddl.sql 파일 위치 확인!


MySQL 8.0 Command Line Client 이용해서 결과 보기

1) STUDENT, MAJOR TABLE 생성하기

2) MAJOR TABLE에 DATA 집어넣기

INSERT INTO MAJOR(MAJOR_NAME) VALUES ("CS");

AUTO_INCREMENT에 의해 MAJOR_ID는 자동으로 1이 들어갔다.

3) STUDENT TABLE에 DATA 집어넣기

INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Joo");
INSERT INTO STUDENT(MAJOR_ID,STUDENT_NAME) VALUES (1,"Bong");

AUTO_INCREMENT에 의해 STUDENT_ID는 자동으로 1,2 가 들어갔다.

4) DESC STUDENT를 통해 외래키 확인하는 법

KEY = MULMAJOR_ID가 외래키이다.

profile
진주의 코딩일기

0개의 댓글