Dandy Now!
  • [Spring Boot][FastCampus][Final Project] 스프링 부트를 이용한 게시판 프로그램 ① - 비즈니스 컴포넌트 설계와 구현/환경 설정
    2022년 08월 30일 00시 35분 43초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    패스트캠퍼스의 "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
    반응형
    댓글