아직 공부한지도 얼마 되지 않았고, 혼자서 뭐를 만들 역량이 되지는 않는 거 같다
그래도 뭐든 만들어보는 게 중요하다 생각해서 다른 분들이 써준 훌륭한 글들을 참고하면서
게시판 만들기를 진행해 볼까 한다
나는 이 분의 글을 참고하며 공부를 할 생각이다
사실 그냥 따라 하기다
열심히 공부하겠습니당
나의 개발 환경
- IntelliJ
- Java 8
- SpringBoot 2.1.8
- Gradle 6.4.1
- MySQL 5.7
라이브러리
- JPA
- Thymeleaf
- Lombok
- LiveReload
- DevTools
이번 편에서는 이렇게 다룰 예정이다
1. 프로젝트 생성 후 스프링 부트 버전 변경
2. Lombok 플러그인 설치 및 설정
3. MySQL 설치
4. HelloWorld 출력
5. JPA 설정
6. 전체적인 프로젝트 구조
7. DevTools 설정
스프링 부트 버전에 경우에는 2.1.x이 2.2.x로 버전업 되면서 설정이 많이 달라졌다고 들어서
참고하는 글을 따라가기로 했다 (2.1.8)
1. 프로젝트 생성 후 스프링 부트 버전 변경
위에서 말했다시피 스프링 부트 버전은 build.gradle에서 따로 변경할 것이기 때문에 아무 버전으로 해도 상관없다
사진과 같이 의존성 설정하고
밑에 GENERATE 클릭
압축 풀기 -> 압축 풀고 나온 폴더 IntelliJ에서 불러오기 -> build.gradle에서 버전 변경
사진과 같이 타이핑으로 버전 변경해주면 된다
2. Lombok 플러그인 설치 및 설정
Lombok 의존성은 해놨으니
롬복 플러그인을 설치해줘야 한다
필자 같은 경우에는 이미 롬복을 설치해놨다
바로 Install 해보자
Install -> IntelliJ 재실행
롬복 플러그인 같은 경우에는 한 번만 설치하면 다른 프로젝트에서도 쓸 수 있다
다만 롬복 설정은 프로젝트마다 따로 해줘야 한다
아마 IntelliJ를 재실행하면 밑에 경고문구가 뜰 것이다
Enable을 바로 클릭해도 되고
사진처럼 CTRL + ALT + S를 눌러 Settings창에서 설정 가능하다
3. MySQL 설치
보통은 인메모리 DB인 h2를 많이 쓴다
하지만 이글에서는 MySQL을 사용할 예정이다
그러기 위해선 MySQL을 따로 설치해줘야 한다
설치 과정은 따로 설명을 안 하겠다
이미 컴퓨터에 깔려있어서 다시 다운받기도 귀찮고
사진 정리할 생각에 가슴이 웅장해졌다
무튼 생략
WorkBench까지 다운을 완료했으면 프로젝트에서 사용할 DB를 생성해야 한다
일단 새로운 커넥션을 만들어 보자
WorkBench를 실행한 후 +버튼을 눌러 커넥션을 생성
Connection Name: 본인이 원하는 커넥션 이름
Hostname: 127.0.0.1 또는 localhost
Port: 기본 포트 3306
Username: 접속하기 위한 아이디
작성을 완료했으면 Test Connection 클릭
원하는 비밀번호 입력
필자는 zxc156156으로 설정
비밀번호까지 입력했으면 성공했다는 창이 뜬다
방금 만든 커넥션이 생성된 걸 확인했다
클릭해서 접속한 후에
스키마를 생성해보자
통조림 모양 클릭
Name: DB이름
Charset/Collation: 사진처럼 설정한다 *Charset/Collation 설명 참고
생성 완료
DB까지 생성을 했으면 설정을 따로 해줘야 할 게 있다
h2를 사용할 경우에는 AutoConfigure에서 설정을 잡아주기 때문에 별도의 설정이 필요 없다
하지만 MySQL을 사용한다면 src/main/resources/application.properties 또는 application.yml 파일에서
커넥션 정보를 작성하여 설정을 잡아줘야 한다
설정을 안 잡아주면
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
이런 에러가 뜰 것이다
이번 프로젝트는 yml로 진행하겠다
src/main/resources폴더로 와서 application.properties파일을 삭제 해주자
그리고 resources폴더에 application.yml 파일을 생성
yml 파일 안에 사진과 같이 코드 작성
사진에서 example부분에 아까 생성한 DB이름을 넣어주자
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot-project?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: zxc156156
여기까지 설정을 완료했다면
Run을 해도 에러가 안 날 것이다
만약에 에러가 난다면
여기를 참고하자
4. HelloWorld 출력
com.project.springbootproject 밑에 controller 패키지를 만들어 주자
그리고 controller 패키지 밑에 HelloController 클래스를 생성
@RestController
- 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줌
- @Controller와 @ResponseBody 두 개를 합친 어노테이션
@GetMapping("/test")
- HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 줌
return값을 줘서 Hello World를 출력
스프링을 실행시켜서 브라우저에 접속해보자
@GetMapping으로 잡아준 주소로 접속을 하면
Hello World가 출력되는 걸 확인할 수 있다
5. JPA 설정
이번엔 아까 만든 yml파일에서 JPA를 설정해보자
jpa.database-platform
- JPA 데이터베이스 플랫폼을 지정
- 예제에서는 MySQL InnoDB를 사용하도록 설정했다
jpa.open-in-view
- OSIV(Open Session In View)는 웹 요청이 완료될 때까지 동일한 EntityManager를 갖도록 해준다
- 스프링 부트에서 OSIV가 기본값으로 true인데, 성능과 확장성 면에서 안 좋다고 해서 false로 설정을 끔
jpa.show-sql
- 콘솔에 JPA 실행 쿼리를 출력
hibernate.format_sql
- 콘솔에 출력되는 JPA 실행 쿼리를 가독성 있게 표현해준다
hibernate.ddl_auto
- 데이터베이스 초기화 전략을 설정
- none: 아무것도 실행하지 않음
- create: SessionFactory가 시작될 때 기존 테이블을 삭제 후 다시 생성
- create-drop: create와 같으나 SessionFactory가 종료될 때 drop을 실행
- update: 변경된 스키마만 반영
- validate: 엔티티와 테이블이 정상적으로 매핑되었는지만 확인
logging.level.org.hibernate.type.descriptor.sql
- SQL에서 물음표로 표기된 부분(bind parameter)을 로그로 출력해서 확인할 수 있음
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot-project?serverTimezone=UTC&characterEncoding=UTF-8
username: root
password: zxc156156
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
open-in-view: false
show-sql: true
hibernate:
format_sql: true
ddl-auto: create
logging:
level:
org:
hibernate:
SQL: DEBUG
type:
descriptor:
sql:
BasicBinder: TRACE
6. 전체적인 프로젝트 구조
전체적인 구조
파일 같은 경우에는 관련 내용이 나올 때 추가해도 되고, 지금 미리 추가해도 상관없다
디렉터리를 위와 같이 구성한 이유는 3 Layer Architecture와 관련이 있다
각 디렉터리의 역할은 다음과 같다
controller
- URL과 실행 함수를 매핑
- 비즈니스 로직이 있는 sevice를 호출하여 비즈니스 로직 처리
- 반환할 템플릿을 정의 및 JSON 등으로 응답
service
- 비즈니스 로직을 구현
- 데이터 처리(모델)를 담당하는 repository에서 데이터를 가져와서 controller에 넘겨주거나, 비즈니스 로직을 처리
domain> entity
- DB 테이블과 매핑되는 객체(Entity)를 정의
- JPA에서는 Entity를 통해 데이터를 조작함
domain> repository
- 데이터를 가져오거나 조작하는 함수를 정의
- interface를 implements 하여 미리 만들어진 함수를 사용할 수 있으며, 또한 직접 구현이 가능
dto
- controller와 service 간에 주고받을 객체를 정의하며, 최종적으로는 view에 뿌려줄 객체
- Entity와 속성이 같을 수 있으나, 여러 service를 거쳐야 하는 경우 dto의 몸집은 더 커짐
- ex) A Entity에 a 속성, B Entity에 b 속성이 있을 때, Z Dto에 a, b 속성으로 정의될 수 있음
- entity와 dto를 분리한 이유는 Entity는 DB 테이블이 정의되어 있으므로, 데이터 전달 목적을 갖는 객체인 dto를
정의하는 것이 좋다
다음으로 resources 디렉터리의 역할은 다음과 같다
static
- css, js, img 등의 정적 자원들을 모아놓은 디렉터리
templates
- 템플릿을 모아놓은 디렉터리
- Thymeleaf는 HTML을 사용한다
7. DevTools 설정
DevTools 같은 경우에는 해도 되고 안 해도 상관없지만
개발 편의를 위해 적용해주면 좋다
매번 서버를 껐다 켤 필요가 없기 때문
CTRL + SHIFT + A를 눌러 액션 창을 띄운 다음 registry 검색
compiler.automake.allow.when.app.running 체크
CTRL + ALT + S 후에 사진과 같이 체크
yml파일에 사진처럼 코드 추가
devtools:
livereload:
enable: true
freemarker:
cache: false
아까 만든 HelloController에서 리턴 값에 느낌표를 붙이면
자동으로 스프링이 재실행된다
브라우저 확인 완료!
기본 환경 설정이 끝났습니다
아직 공부한 지 두 달도 안돼서 설명이 틀릴 수도 있고 많이 부족할 수도 있습니다
이점은 양해 부탁드립니다
뭐 대부분 참고하면서 쓰긴 하지만요ㅎㅎ
이 포스팅은
이 글을 토대로 작성하였습니다
https://victorydntmd.tistory.com/325
'Spring Boot Project' 카테고리의 다른 글
Spring Boot 게시판 만들기 [3] 게시글 조회, 수정, 삭제 (0) | 2020.08.22 |
---|---|
Spring Boot 게시판 만들기 [2] 게시글 추가하기 (3) | 2020.08.21 |