[Spring Boot 스터디] 5회차

minhyeok·2023년 3월 21일
0
post-thumbnail

학습 내용

데이터베이스

참고 링크 : 데이터베이스 기초 개념 및 용어 정리
따로 블로그 글에 작성 중이다!

MySQL 설치

MySQL 오류 해결

설치하는 도중 위와 같은 오류가 발생하였는데, 위 블로그를 참고하여 해결하였다.

MySQL 설치 완료하였다. Server Status 에 들어가 정상적으로 작동하는 것을 확인하였다.

127.0.0.1 connection 연결하기
test 라는 이름의 새로운 connection을 생성해 쿼리에서 자동으로 만들어진 sys 데이터를 확인해보았다.

Spring Data JPA

ORM 이해하기

📌 자바 클래스와 실제 mysql 테이블을 연결해주는 기능, JPA는 java 어플리케이션에서 ORM 표준으로 사용


  • ORM(Object-Relational Mapping)
    우리가 일반 적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.

1. 의존성 추가

implementation 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

2. application.properties에 아래와 같이 설정을 추가

# MySQL 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# DB Source URL
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/sys?serverTimezone=UTC&characterEncoding=UTF-8

# DB username
spring.datasource.username=root

# DB password
spring.datasource.password={비밀번호}

# true 설정 시 실행되는 쿼리문 로그로 확인 가능
spring.jpa.show-sql=true

# DDL(create, alter, drop) 자동 실행 기능
spring.jpa.hibernate.ddl-auto=update

# JPA의 구현체인 Hibernate가 동작하면서 발생한 SQL의 가독성을 높여준다.
spring.jpa.properties.hibernate.format_sql=true

# JPA 데이터베이스 플랫폼 지정 (현재 MYSQL InnoDB를 사용중)
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

JPA 추가중 오류가 발생하였다.

의존성을 수정해보았더니 정상적으로 작동되었다! mysql-connector-java 이 부분이 문제였는데, 아래 처럼 멘토님의 코드를 참고하여 한번 작성해보았더니 동작했다!
아마 버전 문제였던 것 같다.

implementation 'mysql:mysql-connector-java:8.0.32'

3. Entity 추가

JPA에서 엔티티란 쉽게 생각하면, DB 테이블에 대응하는 하나의 클래스라고 생각할 수 있다. @Entity가 붙은 클래스는 JPA가 관리해주며, JPA를 사용해서 DB 테이블과 매핑할 클래스는 @Entity를 꼭 붙여야만 매핑이 가능하다.

📌 @Entity 사용 시 주의사항

  • 접근 제어자가 public 혹은 protected 인 기본 생성자가 필수
  • final 클래스, enum, interface, inner 클래스에는 사용이 불가능
  • 저장하려는 속성은 final이면 안된다.
import javax.persistence.*;

@Table
@Entity
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

		public TestTable() {
		}
}
  • @Id
    • 해당 테이블의 PK 필드
  • @GeneratedValue
    • PK의 생성 규칙 표시
    • Spring Boot 2.0부터는 auto_increment를 위해서 GenerationType.IDENTITY 옵션 추가 필수
  • @Column
    • 테이블의 칼럼임을 표시
    • 필수 x, 기본값 외에 변경이 필요한 옵션이 존재할 경우 사용

위와 같이 TestTable 이 생성되는 것을 확인하였다.

참고 링크: MySQL & JPA 연동 및 테스트 (Gradle 프로젝트)

5회차 미션

데이터베이스 면접 단골질문

  1. 데이터베이스의 특징에 대해 설명해주세요.
  • 실시간 접근성(Real-Time Accessibility): 실시간 처리에 의한 응답이 가능해야 한다.
  • 계속적인 변화(Continuous Evolution): 새로운 데이터의 삽입(Insert), 삭제(Delete), 갱신(Update)로 항상 최신의 데이터를 유지한다.
  • 동시 공용(Concurrent Sharing): 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 한다.
  • 내용에 의한 참조(Content Reference): 데이터베이스에 있는 데이터를 참조할 때 사용자의 요구에 따른 데이터 내용으로 데이터를 찾는다.
  1. 데이터베이스 언어(DDL, DML, DCL)에 대해 설명해주세요.

각각 데이터 조작어, 데이터 정의어, 데이터 제의어 이다.
DML(데이터 조작어)는 저장된 데이터를 실질적으로 처리하는데 사용되는 언어이다. 데이터베이스의 생성 및 변경, 제거를 담당한다.
DDL(데이터 정의어)는 데이터 베이스를 정의하는 언어이다. 데이터베이스 안의 값들을 변경, 수정, 입력한다.
DCL(데이터 제의어)는 데이터베이스에 접근하거나 객체에 권한을 주는 역할이다. 데이터베이스의 접속 권한등을 수정한다.

  1. 트랜잭션이란 무엇인지 설명해주세요.

트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
간단하게, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다. SELECT, UPDATE, INSERT, DELETE 와 같은 행동을 뜻한다.

sql문 연습하기

  1. sql문으로 아래 조건을 만족하는 student 테이블 생성하기 (workbench로 실습)

    컬럼명데이터타입조건
    idbigintprimaray key, not null, auto increment
    namevarcharnot null
    classvarchar미입력 시 default값인 ‘basic’으로 저장되도록
create table student (
	id bigint not null auto_increment primary key,
	name varchar(20) not null,
    class varchar(20) not null default 'basic'
)

참고 링크: 제약 조건
참고 링크2: 제약 조건

DESC student

위 코드를 통해 생성한 테이블을 확인할 수 있다.

실수로 class 열에서 NOT NULL 조건을 추가하였기 때문에 삭제해야했다.

하지만 그랬더니 default 조건이 사라졌다;; 다시 추가해주었다.

여차저차 완료했다!

  1. programmers에서 sql 코딩테스트 문제 중 level1 문제들 풀기 (5문제 이상)
    블로그 글에 따로 작성해 놓았다. 링크

student entity로 연결하기

위에서 생성한 student와 동일한 형태를 갖을 수 있는 엔티티 Student 클래스를 생성하고 연결해보세요. (새로운 테이블이 생기지 않고 에러가 발생하지 않는다면 잘 연결된 겁니다!)

import javax.persistence.*;

@Table(name = "student")
@Entity(name = "student")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(nullable = false, name = "name",length = 20)
    private String username;

    @Column(name = "class", columnDefinition = "varchar(20) default 'basic'")
    private String userclass;
}

위와 같이 Student Entity 클래스를 생성하고 컴파일 하였다.

정상적으로 연결이 된 듯 하다,,,?!

여기서 제대로 동작이 잘 된건지 테스트 하기 위해 studenttest 라는 테이블을 쿼리에서 작성하였다. 꼭 새로 고침해서 확인해야한다!

create table studenttest (
	id bigint not null auto_increment primary key,
	name varchar(20) not null,
    class varchar(20) default 'normal'
)

@Table(name = "studenttest")
@Entity
public class StudentTest {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(nullable = false, name = "name",length = 20)
    private String username;

    @Column(name = "class", columnDefinition = "varchar(20) default 'normal'")
    private String userclass;
}

성공적으로 연결이 됐다 !! 그 전에 student entity 도 정상적으로 연결이 된 것으로 생각된다 ㅎㅎ

정리

  • 배운 내용, 깨달은 점
    이번에는 데이터베이스와 관계형 데이터베이스, JPA , SQL에 관한 전반적인 내용을 알아보았다.
    JPA 세팅을 통해 SQL과 연동해보았다.
    SQL의 기초 쿼리문을 프로그래머스 Level 1 문제들을 통해 공부해보았다.
    또한, 실제로 MySQL 에서 쿼리문을 작성하여 Student 테이블을 생성하고, IntelliJ 에서 동일한 형태를 갖는 Entity Student 클래스를 생성하여 연결해 보았다. 다행히 오류 없이 잘 연동되었다!
    꼭 새로고침을 눌러 스키마를 확인하도록 해야겠다!

  • 어려웠던 점, 반성하고 싶은 점 / 개선할 방법
    SQL 기본 쿼리문과 Entity 작성하여 연결할 때 조건문이 어려워서 시간이 좀 걸렸다. 아직 모르는게 너무 많았다.. GenerationType. 에도 다양한 방법이 있고, @Column 에도 조건이 너무 다양해서 원하는 조건 찾기가 힘들었는데, 반드시 정리 해놓아야겠다!

  • 궁금한 점
    이번 회차에는 없습니다!

0개의 댓글