본문 바로가기
Spring/GuestBook

GuestBook #1 개발환경 세팅부터 CURD테스트까지

by java나유 2022. 10. 29.

**guestbook

⇒하나의 테이블을 생성하고 테이블에 대한 CRUD 작업을 수행하는 애플리케이션으로 출력은 thymeleaf를 이용하고 데이터베이스 연동은 JPA(Hibernate로 구현)를 사용

 

전체 디렉토리

 

1.개발환경

1)Language: Java11

2)Framework: Spring Boot, Bootstrap

3)Database: MySQL 8.0

4)IDE : Intellij

5)WAS:Tomcat

 

 

2.프로젝트 생성 및 기본 설정

1)기본 의존성

  • Spring Boot Dev Tools
  • Lombok
  • Spring Web
  • Thymeleaf
  • Spring Data JPA
  • MariaDB Driver

@Query annotation을 사용했을 때의 단점을 보안하고자 Querydsl을 사용 독려

@MappedSuperclass:테이블로 생성하지 않은 Entity 클래스

2)thymeleaf에서 날짜를 포맷에 맞게 출력하는 라이브러리 의존성을 bulid.gradle에 추가

implementation group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-java8time'

3)application.properties

#MariaDB
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=#
spring.datasource.password=#
spring.datasource.url=jdbc:#/#?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=UTC

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MariaDB103Dialect
logging.level.org.hibernate.type.descriptor.sql=trace

#Live Reload
spring.devtools.livereload.enabled=true

spring.thymeleaf.cache=false

4)프로젝트 실행

⇒콘솔 메세지 확인

 

5)레이아웃 설정

⇒부트스트랩(반응형 웹을 쉽게 적용하기 위한 자바스크립트 라이브러리)을 적용한 SimpleSidebar 다운로드

https://startbootstrap.com/template/simple-sidebar

⇒다운로드 받은 파일 압축 해제

⇒압축을 해제한 3개의 디렉토리와 하나의 html 파일을 resources/static 디렉토리에 복사

⇒templates 디렉토리에 layout (기본 레이아웃 파일 설정) 디렉토리를 생성 ⇒templates 디렉토리에 guestbook (화면에 보여지는 뷰)디렉토리 생성

 

3.메인 화면 출력

GuestbookApplication

@Controller
@Log4j2 //로그기록 용
public class GuestBookController {
    @GetMapping({"/","/guestbook/list"})
    public String List(){
        log.info("list.................");
        return "guestbook/list";
    }
}

4.데이터 생성 날짜와 수정 날짜를 자동으로 설정하기 위한 작업

1)Spring Boot와 Application 클래스 상단에 JPA에 감시 위한 설정을 추가

@EnableJpaAuditing

2)데이터 생성 날짜와 수정날짜를 갖는 상위 Entity클래스 생성

BaseEntity

@MappedSuperclass
//Jpa를 감시하고 있다가 데이터를 수정
@EntityListeners(value = {AuditingEntityListener.class})
@Getter
public abstract class BaseEntity {
    //데이터 생성 날짜를 설정
    @CreatedDate
    @Column(name="regdate", updatable = false)
    private LocalDateTime regDate;

    //데이터의 마지막 수정 날짜를 설정
    @LastModifiedDate
    @Column(name="moddate")
    private LocalDateTime modDate;
}

3) 방명록 테이블과 연동할 Entity클래스 생성

GuestBook

package com.ynsoft.guestbook.entity;

import lombok.*;

import javax.persistence.*;

@Entity
//Getter밖에 안 만들면 수정은 못함
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class GuestBook extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long gno;

    @Column(length =100, nullable = false)
    private String title;

    @Column(length =1500, nullable = false)
    private String content;

    @Column(length =50, nullable = false)
    private String writer;

    //수정메소드를 직접 만든다
    public void changeTitle(String title){
        this.title=title;
    }
    public void changeContent(String content){
        this.content=content;
    }
    
}

4)애플리케이션으로 만들어졌나 확인 && 데이터베이스에 테이블 만들어졌는지 확인

⇒MySQL에서는 GuestBook으로 Entity설정하면 테이블 이름은 guest_book으로 설정

 

5.GuestBook Entity의 CRED작업을 위한 Repository 인터페이스 생성

1)Repository를 Test하기 위한 클래스를 src/test/java 디렉토리에 생성

RepositoryTest

@SpringBootTest
public class RepositoryTest {
    @Autowired
    private GuestBookRepository guestBookRepository;
}

2)데이터 삽입 테스트

RepositoryTest

@SpringBootTest
public class RepositoryTest {
    @Autowired
    private GuestBookRepository guestBookRepository;

    //데이터 삽입테스트
    @Test
    public  void inserTest(){
        //300개의 가상 데이터 삽입
        IntStream.rangeClosed(1,300).forEach(i->{
            GuestBook guestBook = GuestBook.builder()
                    .title("Title...."+i)
                    .content("Content_"+i)
                    .writer("user" + (i %10))
                    .build();
            guestBookRepository.save(guestBook);
        });
    }
}

주의**

*MariaDB ⇒MariaDB인데 GenerationType.AUTO)로하면 테이블은 생성 되지만, 삽입은 불가.

GeneratedValue(strategy = GenerationType.IDENTITY)

 

3)데이터 수정

RepositoryTest

@Test
    public void updateTest() {
        //데이터 1개 찾아오기
        Optional<GuestBook> result = guestBookRepository.findById(103L);
        //데이터가 존재할 때 수정
        if(result.isPresent()){
            GuestBook guestBook = result.get();
            guestBook.changeTitle("제목변경");
            guestBook.changeContent("내용수정");
            guestBookRepository.save(guestBook);
        }
        //데이터가 존재하지 않을 때
        else{
            System.out.println("데이터가 존재하지 않음");
        }
    }
Optional isPresent() Null을 확인하는 JAVA Code

4)데이터 삭제

@Test
    public void deleteTest() {
        //데이터 1개 찾아오기
        Optional<GuestBook> result = guestBookRepository.findById(103L);
        //데이터가 존재할 때 수정
        if(result.isPresent()){
            GuestBook guestBook = result.get();
            guestBookRepository.delete(result.get());
        }
        //데이터가 존재하지 않을 때
        else{
            System.out.println("데이터가 존재하지 않음");
        }
    }

5)전체데이터 가져오기 테스트

@Test
    public void selectTest() {
       List<GuestBook> list=
               guestBookRepository.findAll();
       for(GuestBook guestBook : list){
           System.out.println(guestBook);
       }
    }
728x90

댓글