[Spring Boot] 1. 스프링 부트 도전하기

13305 단어 Spring bootSpring boot

프로젝트를 위한 준비

개발 도구의 준비

인텔리제이를 이용해서 본 강의를 사용합니다.

https://www.jetbrains.com/ko-kr/idea/download/#section=windows

유료버전을 쓰고 싶지만, community 버전을 다운받아주도록 합시다

Spring initializar를 이용한 프로젝트 생성

유료버전은 인텔리제이에서 스프링 부트를 간단하게 만들 수 있습니다.

community 버전은 https://start.spring.io/ 에서 프로젝트를 생성해주도록 합니다

스프링 프로젝트 실행 해보기

Maria 데이터베이스와 Spring data Jpa

MariaDB는 MySQL과 거의 동일한 기능을 제공하면서도 완전한 오픈소스라는것이 장점

따라서 라이센스 비용에 대한 걱정 없이 시스템을 운영할 수 있고, AWS 와 연동시에도 최소한의 비용으로 운영이 가능함

MariaDB의 설치와 데이터베이스 생성

설치페이지 에서 MariaDB Server 항목을 선택하여 설치 해줍니다.

설치 과정에서 root 계정의 패스워드UTF8에 대한 세팅 (use UTF8 as default server's charcter ser)은 체크 해주기

설치가 끝나면 HeidSQL = 관리도구 이면서 SQL 편집 기능 가지고 있음

실행해서 root 계정에 연결하는 정보를 입력

Spring Data JPA를 이용하는 프로젝트의 생성

의존성 항목에 Spring Data JPA 넣기

build.gradle 설정

dependencies {
   ...
   compile group: 'org.mariadb.jdbc', name: 'mariadb-java-client'
  ...
}

application.properties 설정

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/bootex
spring.datasource.username=***********
spring.datasource.password=***********

username,password는 mariadb에서 설정한 username 과 password로 연동하기

Spring Data Jpa의 소개

자바의 ORM, java Persistence API

JPA는 단순한 스펙이기 때문에 해당 스펙을 구현하는 구현체마다 회사의 이름이나 프레임워크의 이름이 다르게 되는데, 여러 프레임워크중 Hibernate가 가장 유명함.

엔티티 클래스와 JpaRepository

Memo 엔티티 클래스

package org.zerock.ex2.entity;

import lombok.*;

import javax.persistence.*;

@Entity //해당 클래스가 엔티티를 위한 크래스이며, 해당 클래스의 인스턴스들이 jpa로 관리되는 엔티티 객체라는 것을 의미
@Table(name = "tbl_memo") // 어떠한 테이블로 생성할 것인지에 대한 정보를 담기위한 어노테이션 tbl_memo 이름 테이블로 생성
@ToString
@Getter //Getter 메서드 생성
@Builder // 객체 생성 처리
@AllArgsConstructor // @Builder를 사용하기 위한 어노테이션
@NoArgsConstructor // @Builder를 사용하기 위한 어노테이션
public class Memo {

    @Id //@Entity가 붙은 클래스는 pk필드를 @id로 지정해줘야한다.
    @GeneratedValue (strategy = GenerationType.IDENTITY) //자동생성되기 위한 어노테이션
    private Long mno;

    @Column(length = 200, nullable = false) //추가적인 필드가 필요할 경우 Column으로 속성 지정 가능
    private String memoText;
}

@Entity

JPA에서는 반드시 @Entity를 추가해줘야한다. 해당 클래스가 엔티티를 위한 클래스 이며, 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체라는 것을 의미

@Table

데이터베이스상에서 엔티티 클래스를 어떠한 테이블로 생성할 것인지에 대한 정보를 담기 위한 어노테이션

예를 들어 @Table(name="t_memo") 와 같이 지정하는 경우에는 생성되는 테이블의 이름이 t_memo 테이블로 생성됨

@ Id 와 GeneratedValue

@Entity가 붙은 클래스는 Pk에 해당하는 특정 필드를 @Id로 지정해줘야함. 자동으로 생성되는 번호를 사용하기 위해서 @GeneratedValue어노테이션 사용

GeneratedValue(startegy = GenerationType.xx) 키생성 전략 종류

AUTO(default) =JPA 구현체가 생성 방식을 결정

IDENTITY - 사용하는 데이터베이스가 키 생성을 결정 MYSQL의 경우 auto increment 방식

SEQUENCE - 데이터베이스의 sqeuence를 이요해서 키를 생성

TABLE- 키 생성 전용 테이블을 생성해서 키 생성

@Colunm

추가 필드(컬럼)이 필요한 경우 사용 주로 nullable, nmame, length등을 이용함

@Builder @AllArgsConstrutor @NoArgsConstructor

객체를 생성할 수 있게 처리

JPA 설정 Applicationi.properties

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

ddl-auto : 자동으로 DDL설정 create 면 매번 테이블 생성, update는 없으면 생성 있으면 alter ,

format_sql = Hibernate 동작하면서 발생하는 SQL문 출력

show-sql: JPA 처리시 발생하는 SQL 보여줄지 결정

JpaRepository 사용하기

package org.zerock.ex2.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.ex2.entity.Memo;

import java.util.List;

//JpaRepository를 사용할때는 엔티티의 타입 정보(Memo 클래스 타입)와 @ID의 타입을 지정 함
// jpa는 인터페이스 선언만으로 빈 등록됨
public interface MemoRepository extends JpaRepository<Memo, Long> {

}

CRUD :

insert 작업 :save(엔티티 객체)

select 작업: findByID(키 타입), getOne(키 타입)

update 작업: save(엔티티 객체)

delete 작업: deleteById(키 타입), delete(엔티티 객체)

페이징/정렬 처리하기

페이지 처리에 필요한건 PageRequest 생성자(protected 선언으로 new 사용못함)

객체 생성하기 위한 static한 of()를 이용해서 처리.

page.size.Sort 정보를 이용해서 객체 생성

쿼리 메서드(Query Methods) 기능 과 @Query

  • 쿼리메서드 : 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
  • @Query: SQL 과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능
  • Querydsl 등의 동적 쿼리 처리 기능

spring data jpa 레퍼런스

주로 SQL에서 사용되는 키워드와 동일하게 작성되어 있음

예를 들어 Memo 객체의 mno 값이 70 부터 80사이의 객체들을 구하고 mno의 역순으로 정렬하고 싶다면 다음과 같은 메서드를 추가하면됨

package org.zerock.ex2.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.ex2.entity.Memo;

import java.util.List;

//JpaRepository를 사용할때는 엔티티의 타입 정보(Memo 클래스 타입)와 @ID의 타입을 지정 함
// jpa는 인터페이스 선언만으로 빈 등록됨
public interface MemoRepository extends JpaRepository<Memo, Long> {
    List<Memo> findByMnoBetweenOrderByMnoDesc(long from, long to);

}

Spring Data Jpa가 제공하는 쿼리 메서드가 편리할때도 있지만, 조인이나 복잡한 조건을 처리해야되는 경우 불편할때가 많다.

기본적인 경우만 사용하고 @Query를 이용하는게 가능

@Query는 메서드의 이름과 상관없이 메서드에 추가한 어노테이션을 통해서 처리

  • 필요한 데이터만 선별적으로 추출하는 기능이 가능
  • 데이터베이스에 맞는 순수 SQL 사용하는 기능

예를 들면 mno의 역순으로 정렬하라고 하자면

@Query("select m from Memo m order by m.mno desc")
List<Memo> getListDesc();

스프링 MVC 와 Thymeleaf

좋은 웹페이지 즐겨찾기