방명록
- [Spring Boot][FastCampus][Final Project] 스프링 부트를 이용한 게시판 프로그램 ① - 비즈니스 컴포넌트 설계와 구현/환경 설정2022년 08월 30일 00시 35분 43초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
패스트캠퍼스의 "Java&Spring boot로 시작하는 웹 프로그래밍" 과정을 마무리하면서 파이널 프로젝트를 수행하였다. 완료하여 제출한 과제를 4회에 걸쳐 정리해보고자 한다. 프로젝트명과 설명은 다음과 같다.
01. 프로젝트 명
스프링 부트를 이용한 게시판 프로그램
02. 프로젝트 설명
스프링 부트를 이용하여 웹 프로젝트를 생성하고 BOARD 테이블에 대한 CRUD 기능의 게시판 프로그램을 개발합니다. 데이터베이스 연동은 반드시 Spring Data JPA를 이용하여 처리해야 합니다. 로그인, 회원 가입 등 회원과 관련된 어떤 기능도 구현하지 않습니다. 오로지 게시판 프로그램의 CRUD 기능만 구현합니다.아래의 과제 상세 1~4는 "비즈니스 컴포넌트 설계와 구현/환경 설정"에 관한 요구사항과 작성한 코드이다.
과제 상세 1
영속성 관리를 위해 Board 엔티티 클래스를 작성하고 JPA가 제공하는 Annotation을 설정하여 BOARD 테이블과 매핑합니다. 식별자 필드 값은 시퀀스를 이용하여 자동으로 증가하도록 설정합니다.
src\main\java\com\fastcampus\board\model\entity\Board.java
package com.fastcampus.board.model.entity; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @Entity @Table(name = "board") public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long seq; @Column(length = 200, nullable = false) private String title; @Column(length = 20, nullable = false) private String writer; @Column(length = 2000, nullable = false) private String content; @Column(nullable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime regDate; @Column(columnDefinition = "bigint default 0") private Long cnt; @Builder public Board(Long seq, String writer, String title, String content, LocalDateTime regDate, Long cnt) { this.seq = seq; this.writer = writer; this.title = title; this.content = content; this.regDate = LocalDateTime.now(); this.cnt = cnt; } }
과제 상세 2
Repository 인터페이스는 CrudRepository 인터페이스를 상속하여 작성합니다.
src\main\java\com\fastcampus\board\repository\BoardRepository.java
package com.fastcampus.board.repository; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import com.fastcampus.board.model.entity.Board; @Repository public interface BoardRepository extends CrudRepository<Board, Long> { }
과제 상세 3
비즈니스 컴포넌트에 대한 Service 인터페이스는 별도로 도출하지 않습니다. 비즈니스 컴포넌트를 사용하는 클라이언트는 인터페이스 없이 바로 서비스 구현 클래스를 사용하도록 설계합니다.
src\main\java\com\fastcampus\board\service\BoardService.java
package com.fastcampus.board.service; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.fastcampus.board.dto.BoardDto; import com.fastcampus.board.model.entity.Board; import com.fastcampus.board.repository.BoardRepository; @Service public class BoardService { private BoardRepository boardRepository; public BoardService(BoardRepository boardRepository) { this.boardRepository = boardRepository; } // 게시물 생성 @Transactional public Long savePost(BoardDto boardDto) { return boardRepository.save(boardDto.toEntity(0L)).getSeq(); } // 게시물 수정 @Transactional public Long updatePost(BoardDto boardDto) { Board board = boardRepository.findById(boardDto.getSeq()).get(); System.out.println("board : "+board); return boardRepository.save(boardDto.toEntity(board.getCnt())).getSeq(); } // 게시물 전체 가져오기 @Transactional public List<BoardDto> getBoardList() { Iterable<Board> boardList = boardRepository.findAll(); List<BoardDto> boardDtoList = new ArrayList<>(); for(Board board : boardList) { BoardDto boardDto = BoardDto.builder() .seq(board.getSeq()) .writer(board.getWriter()) .title(board.getTitle()) .content(board.getContent()) .regDate(board.getRegDate()) .cnt(board.getCnt()) .build(); boardDtoList.add(boardDto); } return boardDtoList; } // 게시물 삭제 @Transactional public void deletePost(Long id) { boardRepository.deleteById(id); } // 게시물 상세 조회 @Transactional public BoardDto getPost(Long id) { Board board = boardRepository.findById(id).get(); // 조회수 +1 if(board.getCnt() == null) { board.setCnt(1L); } else { board.setCnt(board.getCnt()+1); } BoardDto boardDto = BoardDto.builder() .seq(board.getSeq()) .writer(board.getWriter()) .title(board.getTitle()) .content(board.getContent()) .regDate(board.getRegDate()) .build(); return boardDto; } }
과제 상세 4
프로젝트의 모든 환경설정은 application.properties 파일을 통해 처리합니다. application.properties 파일에 Server Port, DataSource, JPA 구현체 설정 등 애플리케이션의 모든 환경을 설정합니다.
src\main\resources\application.properties
# MySQL spring.jpa.database=mysql spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect # db source url spring.datasource.url=jdbc:mysql://localhost:3306/fastcampus?useUnicode=true&charaterEncoding=utf-8&serverTimezone=Asia/Seoul spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=1234 # JPA spring.jpa.generate-ddl=true spring.jpa.hibernate.ddl-auto=create #spring.jpa.hibernate.ddl-auto=update # Show query spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true # View with JSP spring.mvc.view.prefix=/WEB-INF/ spring.mvc.view.suffix=.jsp
728x90반응형'언어·프레임워크 > Spring Boot' 카테고리의 다른 글
다음글이 없습니다.이전글이 없습니다.댓글