스프링부트, 타임리프(Thymeleaf)로 파일게시판 만들기
#3 VO, Mapper Service 작성 (3/n)
아래 사진은 지난번에 작성한 프로젝트 구조입니다. 이번에는 VO와 Mapper, 그리고 Service를 작성하겠습니다.
VO(Entity) 작성
먼저 게시판에 필요한 객체를 생성합니다. 저는 게시글에 게시글 고유번호, 작성자, 제목, 내용, 작성일 이렇게 5가지를 넣으면 되지 않을까 생각했습니다. 그러면 이를 바탕으로 객체를 작성하겠습니다. bean 패키지 내에 FileBoardVO.java 파일을 생성하고 다음 코드를 작성합니다. Lombok을 이용해 @Data를 입력해서 setter()/getter(), toString() 등 귀찮은 작업을 자동으로 생성해주도록 합니다. @NoArgsConstructor와 @AllArgsConstructor도 입력해 생성자를 만들어줍니다.
FileBoardVO.java
package com.example.demo.bean;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileBoardVO {
private int b_no;
private String title;
private String content;
private String writer;
private Date reg_date;
}
Mapper 작성
이제 자바파일의 Mapper를 작성합니다. 자바파일에서 Mapper는 메서드 형식으로 작성합니다. 메서드로 추후 작성할 xml파일의 Mapper랑 연동하여 쿼리문을 실행하도록 합니다. Mapper임을 알려주기 위해 @Mapper 어노테이션을 달아주고, 클래스가 아닌 인터페이스로 작성합니다. 메서드는 CRUD가 잘 동작하도록 생각해서 작성합니다.
FileBoardMapper.java
package com.example.demo.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.example.demo.bean.FileBoardVO;
@Mapper
public interface FileBoardMapper {
List<FileBoardVO> getFileBoardList(); //게시글 리스트 출력
FileBoardVO fileBoardDetail(int b_no); //게시글 세부내용 보기
int fileBoardInsert(FileBoardVO fileBoard); //게시글 생성
int fileBoardUpdate(FileBoardVO fileBoard); //게시글 수정
int fileBoardDelete(int bno); //게시글 삭제
}
Service 작성
이제 쿼리문을 실행한 Mapper를 바로 사용하는 것이 아닌, 무언갈 한 번 더 거쳐서 사용할 Service를 만들겠습니다. 바로 사용해도 문제가 없지만, 굳이 이렇게 하는 이유는 쿼리를 실행하는 부분과 이를 가져다 사용하는(여기에서는 Service) 부분을 분리해서 역할을 명확히 나누고자 함이 아니었을까... 생각해봅니다. (내가 왜그랬지...)
Service를 만들때도 그냥 ~Service.java를 만드는 것이 아니라 ~ServiceImpl.java, 즉 implement 파일을 하나 더 만들어줍니다. 자바의 특징 중 하나인 다형성을 위함이라 하는데.... 여튼 mapper 하나만 만들어서 사용해도 되는데 왜 이렇게 했나 싶습니다. 흐름을 보기가 조금 더 복잡해지긴 했지만 뭐 여튼 이런 개념들을 알고 넘어가고자 하는 부분이니 번거롭더라도 작성하겠습니다.
FileBoardService.java
package com.example.demo.service;
import java.util.List;
import com.example.demo.bean.FileBoardVO;
public interface FileBoardService {
List<FileBoardVO> getFileBoardList();
FileBoardVO fileBoardDetail(int b_no);
int fileBoardInsert(FileBoardVO fileBoard);
int fileBoardUpdate(FileBoardVO fileBoard);
int fileBoardDelete(int bno);
}
FileBoardMapper.java 파일과 내용이 똑같지 않나요? 이제 이를 상속받는 Impl 파일을 작성합니다. @Service 어노테이션을 추가해주고, 쿼리작업을 한 mapper파일을 @Autowired 어노테이션으로 설정해서 mapper 내에서 작성한 메서드들의 return값을 가져오도록 합니다.
FileBoardServiceImpl.java
package com.example.demo.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.bean.FileBoardVO;
import com.example.demo.mapper.FileBoardMapper;
@Service
public class FileBoardServiceImpl implements FileBoardService {
@Autowired
FileBoardMapper fileboardmapper;
@Override
public List<FileBoardVO> getFileBoardList() {
return fileboardmapper.getFileBoardList();
}
@Override
public FileBoardVO fileBoardDetail(int b_no) {
return fileboardmapper.fileBoardDetail(b_no);
}
@Override
public int fileBoardInsert(FileBoardVO fileBoard) {
return fileboardmapper.fileBoardInsert(fileBoard);
}
@Override
public int fileBoardUpdate(FileBoardVO fileBoard) {
return fileboardmapper.fileBoardUpdate(fileBoard);
}
@Override
public int fileBoardDelete(int bno) {
return fileboardmapper.fileBoardDelete(bno);
}
}
문제 없이 잘 작성하셨나요? 이제 MySQL에서 Database와 Table을 작성하고, FileBoardMapper.java에 있는 메서드를 실행해줄 쿼리문을 뿅뿅Mapper.xml에서 작성할겁니다. 다음글에서 만나요!
댓글