build.gradle의 dependencies 에 프로그램에 필요한 라이브러리를 넣으면 된다.
dependencies {
//롬복 추가
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-mustache'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
이렇게 추가해준다.
추가하고 우상단에 보면 코끼리 새로고침 아이콘이 뜨는데 그걸 해줘야함
추가한 내용을 새로고침 해서 인터넷에서 추가한 내용을 다운해줌
좀 기다리면 이렇게 lombok이 설치된 것을 확인할 수 있다.
상단 메뉴바 help > find action > plugins 검색
marketplace 가서 lombok 검색 해서 플러그인 설치하면 된다
그런데 2020.03 이후 버전은 lombok이 자체 설치되어 있음 그래서 나는 플러그인 설치는 따로 안했다.
file > settings > Build, Execution, Deployment > Compiler > Annotation Processors 로 이동
저거 체크하기
이렇게 하면 롬복을 사용할 준비 끝
package com.example.firstproject.dto;
import com.example.firstproject.entity.Article;
public class ArticleForm {
private String title;
private String content;
//생성자
public ArticleForm(String title, String content) {
this.title = title;
this.content = content;
}
@Override
public String toString() {
return "ArticleForm{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
public Article toEntitiy() {
return new Article(null,title,content);
}
}
전에 만든 dto의 ArticleForm 클래스다.
생성자랑 toString 메소드가 보인다.
package com.example.firstproject.dto;
import com.example.firstproject.entity.Article;
import lombok.AllArgsConstructor;
import lombok.ToString;
@AllArgsConstructor
@ToString
public class ArticleForm {
private String title;
private String content;
public Article toEntitiy() {
return new Article(null,title,content);
}
}
이렇게바꿔준다
생성자를 @AllArgsConstructor가 toString을 @ToString이 대체해준다.
이렇게 바꾸고 서버 돌려서 실행해보면 잘 된다.
package com.example.firstproject.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity // 이 어노테이션을 붙여야 DB가 이 객체를 인식한다
public class Article {
@Id // 각 객체를 식별하기 위한 Id임 (주민번호 같은거)
@GeneratedValue // id를 1, 2, 3 ,.. 자동생성하기 위함
private Long id;
@Column //DB가 필드를 인식할 수 있게 해줌
private String title;
@Column
private String content;
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
엔티티 클래스인 Article 클래스
package com.example.firstproject.entity;
import lombok.AllArgsConstructor;
import lombok.ToString;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity // 이 어노테이션을 붙여야 DB가 이 객체를 인식한다
@AllArgsConstructor
@ToString
public class Article {
@Id // 각 객체를 식별하기 위한 Id임 (주민번호 같은거)
@GeneratedValue // id를 1, 2, 3 ,.. 자동생성하기 위함
private Long id;
@Column //DB가 필드를 인식할 수 있게 해줌
private String title;
@Column
private String content;
}
이렇게 바꿔준다.
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class ArticleController {
@Autowired // 스프링부트가 미리 생성한 객체를 가져다가 연결
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleForm(){
return "articles/new";
}
@PostMapping("articles/create")
public String createArticle(ArticleForm form){
System.out.println(form.toString());
// 1. DTO를 Entitiy로 변환해야한다
Article article = form.toEntitiy();
System.out.println(article.toString());
// 2. Repository에게 Entitiy를 DB안에 저장하게 한다
Article saved = articleRepository.save(article);
System.out.println(saved.toString());
return "";
}
}
ArticleController인데 지금까지 확인을 위해 println으로 출력했다.
그런데 실제 서버에서는 절대 이러한 방식을 사용하지 않는다.
기록에 남지도 않고 서버의 성능에도 악영향을 미친다
로깅 기능으로 대체한다.
로깅은 서버에서 일어나는 일을 전부 기록하는 것이다. 블랙박스처럼..
package com.example.firstproject.controller;
import com.example.firstproject.dto.ArticleForm;
import com.example.firstproject.entity.Article;
import com.example.firstproject.repository.ArticleRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
@Slf4j //로깅을 위한 어노테이션
public class ArticleController {
@Autowired // 스프링부트가 미리 생성한 객체를 가져다가 연결
private ArticleRepository articleRepository;
@GetMapping("/articles/new")
public String newArticleForm(){
return "articles/new";
}
@PostMapping("articles/create")
public String createArticle(ArticleForm form){
// System.out.println(form.toString());
// 로깅 기능으로 println 대체하자
log.info(form.toString());
// 1. DTO를 Entitiy로 변환해야한다
Article article = form.toEntitiy();
//System.out.println(article.toString());
log.info(article.toString());
// 2. Repository에게 Entitiy를 DB안에 저장하게 한다
Article saved = articleRepository.save(article);
//System.out.println(saved.toString());
log.info(saved.toString());
return "";
}
}
클래스 위에 @Slf4j 추가
이걸 추가하면 로깅을 사용할 수 있다.
그리고 클래스 내에서 println을 log.info로 대체했다.
서버를 재실행하고 확인해보자.
이렇게 찍어준다
println으로 찍을 때보다 더 자세함