인프런에서 김영한님의 스프링 입문, 핵심원리, MVC1 강의까지 듣고 약간의 자신감이 생겨 API Server를 만들어보기로 했다.
강의에서는 H2 DB를 한번 사용해봤고, JPA와 DB연결에 대해서는 자세히 배우지 않았다.
그리고 Thymleaf 템플릿 엔진을 사용하여 view를 만드는 MVC 패턴을 주로 공부했었는데, 일단 나는 API Server에 관심이 있기때문에 postman을 사용해 데이터 CRUD 기능만 연습해볼 계획이다!
모두 구글링을 할 예정이고 스프링을 사용해서 처음 도전하는 프로젝트이기때문에 부족한점, 잘못된 점도 있을 수 있음!!!
기능
- 회원가입 (Create)
- 회원 id
- 회원 password
- 회원 username
- 회원 로그인 (jwt를 적용해보고 싶다..!)
- 회원 id
- 회원 password
- 글 등록 (Create)
- 글 제목
- 글 내용
- 작성자(회원)
- 글 수정 (Udate)
- 제목 수정
- 내용 수정
- 글 전체 목록 보기 (Read)
- 글 삭제하기 (Delete)
데이터베이스 설계
회원(User table)
- seq (Long, autoIncrement, pk)
- user_id (String, unique)
- password (String, not nullable)
- user_name (String, not nullable)
글(Post table)
- seq (Long, autoIncrement, pk)
- post_title (String, not nullable)
- post_contents (String, not nullable)
- user_id (String, not nullable, FK)
IDE : Intellij
Java : 11
Database : Mysql8
OS : Windows
1. Springboot project 생성하기
Gradle, Java, Jar 을 선택해주고, Dependencies에는 Spring Web, Lombok을 추가해줬다
2. JPA, DB 설정하기
# build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java'
build.gradle에 dependencies 안에 두줄을 넣어준다.
아까 start.spring.io에서 넣어줄 수 있었는데 그냥 직접넣었다.
build.gradle에 내용을 추가하면 오른쪽 위에 코끼리 모양 아이콘이 뜨는데 꼭 그걸 눌러서 refresh 해주어야 한다. 코끼리 아이콘이 안뜨면 오른쪽 상단에 gradle 파트를 눌러서 새로고침 아이콘을 눌러주자!
# application.properties
# 콘솔에 SQL문 출력 여부
spring.jpa.show-sql=true
# DDL 데이터베이스 기능 사용
spring.jpa.generate-ddl=true
# Mysql 사용
spring.jpa.database=mysql
spring.datasource.url=jdbc:mysql://localhost:3306/[DB name]?characterEncoding=UTF-8&serverTimezone=UTC&autoReconnect=true
spring.datasource.username=[username]
spring.datasource.password=[password]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# hibernate
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
# maintain DB connection
spring.datasource.dbcp.testOnBorrow=true
spring.datasource.dbcp.validationQuery=SELECT 1
- src/main/resources/application.properties 파일에 위의 내용을 추가해준다.
- [ DB name ], [ username ], [ password ] 안에는 해당하는 내용을 넣어주면 된다
- 예를들어 DB username 이 root라면 spring.datasource.username=root 이런식으로!
- # hibernate 부분에는 현재 사용하는 Mysql8이기때문에 MySQL8Dialect 라고 해주었는데, 다른 블로그 찾아보니까 mysql5는 MySQL5~~ 라고 적어주는 것 같다.
- spring.datasource.url과 #maintain DB Connection 밑의 두줄 부분은 스프링에서 일정시간동안 DB pool을 사용안하면 연결이 끊어진다고 해서 추가해줬다!
3. Domain 만들기
- src/main/java/com/youjin 밑에 domain 패키지를 생성해준다.
- 이때 com, youjin은 각각 springboot 프로젝트를 생성할 때 설정한 group과 artifact 이름이다(개인마다 다르겠죠?)
- domain 패키지 밑에 post와 user 패키지를 각각 생성해준다
- post 패키지 밑에는 Post.java, user 패키지 밑에는 User.java 파일을 생성해준다
// User.java
package com.youjin.domain.user;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Table
public class User {
@Id
@GeneratedValue
private long seq;
@Column(unique = true)
private String userId;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String userName;
}
- seq는 자동생성, PK이니까 @Id, GeneratedValue annotation을 붙여준다
- 다른것들은 필요에 따라 unique를 붙여주거나 nullable 을 지정해주면 된다
- getter, setter을 꼭 만들어야 하는데 lombok을 쓰기때문에 class위에 @Getter, @Setter를 붙여주었다 (그럼 private 변수에 대해 getter, setter를 자동으로 생성해준다)
// Post.java
package com.youjin.domain.post;
import com.youjin.domain.user.User;
import lombok.*;
import javax.persistence.*;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Table
public class Post {
@Id
@GeneratedValue
private long seq;
@Setter
@Column(nullable = false)
private String postTitle;
@Setter
@Column(nullable = false)
private String postContents;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userId")
private User user;
}
- Post 객체도 User과 비슷한데, 마지막에 FK로 userId를 넣는 부분만 새롭다
이렇게 해서 YoujinApplication을 실행해보면
Hibernate: create table hibernate_sequence (next_val bigint) engine=InnoDB
Hibernate: insert into hibernate_sequence values ( 1 )
Hibernate: create table post (seq bigint not null, post_contents varchar(255) not null, post_title varchar(255) not null, user_id bigint, primary key (seq)) engine=InnoDB
Hibernate: create table user (seq bigint not null, password varchar(255) not null, user_id varchar(255), user_name varchar(255) not null, primary key (seq)) engine=InnoDB
Hibernate: alter table user drop index UK_a3imlf41l37utmxiquukk8ajc
Hibernate: alter table user add constraint UK_a3imlf41l37utmxiquukk8ajc unique (user_id)
Hibernate: alter table post add constraint FK72mt33dhhs48hf9gcqrq4fxte foreign key (user_id) references user (seq)
console에 table이 만들어지는 과정? 이 출력된다 (아무래도 application.properties에 속성을 추가해줬기 때문인듯!)
그리고 DB를 보면
이렇게 잘 들어간 것을 볼 수 있다. 변수이름은 userName이런식으로 해줬는데 db 생성시에는 _로 설정되나보다!
오늘은 여기까지!
'개발 > Spring' 카테고리의 다른 글
Springboot + Mysql + JPA 로 간단한 프로젝트 3 (1) | 2021.07.16 |
---|---|
Springboot + Mysql + JPA 로 간단한 프로젝트 2 (2) | 2021.07.16 |
스프링부트 console에 color 적용하기, 로그 찍기 (0) | 2021.07.14 |
[스프링 입문] AOP (0) | 2021.06.30 |
[스프링 입문] 스프링 회원관리 예제 - 7. 스프링 DB 접근 기술 (0) | 2021.06.30 |