Chapter 25-3

ChangWoo·2023년 11월 24일
0
post-thumbnail

Part 25. 프로젝트의 첨부파일 - 등록

25.3 BaordController, BoardService의 처리

  • 파라미터를 수집하는 BoardController는 별도의 처리 없이 전송되는 데이터가 제대로 수집되었는지를 먼저 확인한다.
< BoardController >
	@PostMapping("/register")
	public String register(BoardVO board, RedirectAttributes rttr) {
		log.info("=========================");
		log.info("register: " + board);
		if (board.getAttachList() != null) {
			board.getAttachList().forEach(attach -> log.info(attach));
		}
		log.info("=========================");
		service.register(board);
		rttr.addFlashAttribute("result", board.getBno());
		return "redirect:/board/list";
	}
  • BoardController의 regeister()는 BoardService를 호출하기 전에 log를 이용해 확인하는 작업을 먼저 진행한다.
  • 브라우저에서 첨부파일을 추가하고 게시물을 등록하면 서버에서는 아래와 같은 로그들이 출력되는 것을 볼 수 있다.
  • 이 때 첨부파일이 이미지인지 여부에 따라 fileType 등이 제대로 처리되는지 확인한다.
INFO : org.zerock.controller.BoardController - =========================
INFO : org.zerock.controller.BoardController - register: BoardVO(bno=null, title=test, content=test, writer=test, regdate=null, updateDate=null, replyCnt=0, attachList=[BoardAttachVO(uuid=a7a4801e-3775-4f5a-928f-cdc9a7831e6e, uploadPath=2023\09\18, fileName=Ex.txt, fileType=false, bno=null), BoardAttachVO(uuid=557cf283-fa7f-4f18-bf60-b636fbc0b590, uploadPath=2023\09\18, fileName=test.jpg, fileType=true, bno=null), BoardAttachVO(uuid=d0dcba2d-11f3-49ca-9bc9-0c71dfa25392, uploadPath=2023\09\18, fileName=test1.jpg, fileType=true, bno=null)])
INFO : org.zerock.controller.BoardController - BoardAttachVO(uuid=a7a4801e-3775-4f5a-928f-cdc9a7831e6e, uploadPath=2023\09\18, fileName=Ex.txt, fileType=false, bno=null)
INFO : org.zerock.controller.BoardController - BoardAttachVO(uuid=557cf283-fa7f-4f18-bf60-b636fbc0b590, uploadPath=2023\09\18, fileName=test.jpg, fileType=true, bno=null)
INFO : org.zerock.controller.BoardController - BoardAttachVO(uuid=d0dcba2d-11f3-49ca-9bc9-0c71dfa25392, uploadPath=2023\09\18, fileName=test1.jpg, fileType=true, bno=null)
INFO : org.zerock.controller.BoardController - =========================

25.3.1 BoardServiceImpl 처리

  • BoardMapper와 BoardAttachMapper는 이미 작성해 두었기 때문에 남은 작업은 BoardServiceImpl에서 두 개의 Mapper 인터페이스 타입을 주입하고, 이를 호출하는 일이다.
  • 2개의 Mapper를 주입받아야 하기 때문에 자동주입 대신에 Setter 메서드를 이용하도록 수정한다.
< BoardServiceImpl 클래스 >
@Log4j
@Service
public class BoardServiceImpl implements BoardService {
	@Setter(onMethod_=@Autowired)
	private BoardMapper mapper;
	@Setter(onMethod_=@Autowired)
	private BoardAttachMapper attachMapper;
  • 게시물의 등록 작업은 tbl_board 테이블과 tbl_attach 테이블 양쪽 모두 insert가 진행되어야 하기 때문에 트랜잭션 처리가 필요하다.
  • 일반적인 경우라면 오라클의 시퀀스를 이용해 nextval과 currval을 이용해 처리하겠지만, 예제는 이미 MyBatis와 selectkey를 이용했기 때문에 별도의 currval을 매번 호출할 필요는 없다.
< BoardServiceImpl 클래스 >
	@Transactional
	@Override
	public void register(BoardVO board) {
		log.info("register......" + board);
		mapper.insertSelectKey(board);
		if(board.getAttachList() == null || board.getAttachList().size() <= 0) {
			return;
		}
		board.getAttachList().forEach(attach ->{
			attach.setBno(board.getBno());
			attachMapper.insert(attach);
		});
	}
  • BoardServiceImpl의 register()는 트랜잭션 하에서 tbl_board에 먼저 게시물을 등록하고, 각 첨부파일은 생성된 게시물 번호를 세팅한 후 tbl_attach 테이블에 데이터를 추가한다.
  • MyBatis 쪽에 문제가 없다면 데이터베이스의 tbl_attach 테이블에 첨부파일이 여러 개 등록되었을 때 아래와 같은 모습으로 출력되는 것을 볼 수 있다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글