[토이 투표] 개발일지(22.07.02)

재호·2022년 7월 2일
0

개발 일지 22.07.02

투표 처리 메서드 수정(득표수 계산)

지난 일지에서 득표수 계산을 편리하게 하기 위해서 투표 항목 테이블에 count 속성을 추가했었다. 오늘은 실제로 득표수를 계산하는 로직을 구현했다.

	@Override //실제 투표 처리
	public String throwVote(VoteItemDTO itemDTO, String email) {
		VoteItem item = itemRepository.findById(itemDTO.getIno()).get();
		
		VoteDetail detail = VoteDetail.builder().voter(email)
											.voteitem(item)
											.build();
		// save를 하면 commit이 되기 때문에 EntityManager의 persist를 이용
		em.persist(detail);
		
		VoteDetail result = null;
		
		Optional<VoteDetail> optional = detailRepository.findById(detail.getDno());
		if(optional.isPresent()) {
			result = optional.get();
		}
		
		// 득표 수 갱신
		Integer itemCount = detailRepository.countByVoteitem(item);
		//commit 전 이므로 더티 체킹을 이용해 업데이트
		item.countVote(itemCount);
		
		if(result != null) return "성공";
		return "실패";
	}

새로운 메서드를 만들지 않고 사용자가 투표를 실시하면 그 때 count 쿼리를 날려 새로 추가된 표까지 합쳐 득표 수를 계산하고 이를 VoteItem 엔티티의 count 속성에 삽입한다.

투표글에 대한 파일 업로드 처리

투표를 등록할 때 각 투표 항목에 대해 이미지를 넣을 수 있도록 하기 위해 다중 이미지 파일 처리 기능을 구현했다.

#파일 업로드 관련 설정 추가
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=D:\\jin\\temp-repository
spring.servlet.multipart.max-request-size=50MB
spring.servlet.multipart.max-file-size=10MB

#환경의 변화가 생겼을 수정할 정적 상수를 속성으로 생성
member.upload.path=D:\\jin\\temp-repository\\member
item.upload.path=D:\\jin\\temp-repository\\vote-item

우선 application.properties 파일에 파일 업로드 관련 설정을 추가해주었다.

	//application.properties 파일에 작성한 속성 가져오기
	@Value("${member.upload.path}")
	private String uploadPath;
	
	//업로드한 날짜 별로 이미지를 저장하기 위해서 날짜별로 디렉토리를 만들어서 경로를 리턴하는 메서드
	private String makeFolder() {
		//오늘 날짜를 문자열로 생성
		String str = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
		//문자열을 치환 - /를 운영체제의 디렉토리 구분자로 치환
		String realUploadPath = str.replace("//", File.separator);
		//디렉토리 생성
		File uploadPathDir = new File(uploadPath, realUploadPath);
		if(uploadPathDir.exists() == false) {
			uploadPathDir.mkdirs();
		}
		return realUploadPath;
	}

BoardServiceImpl 클래스에 파일 업로드 관련 저장 위치 변수를 등록하고 설정된 저장 위치에 바로 저장하지 않고 업로드 날짜 별로 이미지를 저장하기 위해 추가 디렉토리를 생성하는 makeFolder 함수를 작성했다.

	@Override // 투표글 등록
	public Long registerBoard(BoardDTO boardDTO, List<VoteItemDTO> itemDTO) {
		//파일 업로드 처리
		//전송 받은 파일을 가져오기
		//image 파라미터의 값을 가져오기
		MultipartFile uploadFile = itemDTO.get(0).getImage();
		//전송된 파일이 있다면
		if(uploadFile.isEmpty() == false) {
			//원본 파일의 파일 이름 찾아오기
			String originalName = uploadFile.getOriginalFilename();
			String fileName = originalName.substring(originalName.lastIndexOf("\\") + 1);
			
			//파일을 업로드할 디렉토리 경로를 생성
			String realUploadPath = makeFolder();
			
			//업로드할 파일의 경로를 생성
			String uuid = UUID.randomUUID().toString(); //파일 이름의 중복을 피하기 위해서 생성
			String saveName = uploadPath + File.separator + realUploadPath 
								+ "/" + uuid + fileName;
			Path savePath = Paths.get(saveName);
			try {
				//파일 업로드
				uploadFile.transferTo(savePath);
				//이미지 경로를 DTO에 설정
				itemDTO.get(0).setImageurl(realUploadPath + "/" + uuid + fileName);
			} catch (Exception e) {
				log.info(e.getLocalizedMessage());
			}
		}
		
		//마감 시간을 설정하지 않았다면 24시간을 기본값으로 설정
		if(boardDTO.getClosetime() == null) {
			ZonedDateTime nowUTC = ZonedDateTime.now(ZoneId.of("UTC"));
			LocalDateTime currentDateTime = nowUTC.withZoneSameInstant(
											ZoneId.of("Asia/Seoul")).toLocalDateTime();
			LocalDateTime closetime = currentDateTime.plusHours(24);
			boardDTO.setClosetime(closetime);
		}
		
		// Board 정보 DB에 저장
		Board board = dtoToEntity(boardDTO);
		boardRepository.save(board);
		
		// 투표 항목들 리스트로 변환 후 한번에 DB에 저장
		List<VoteItem> list = new ArrayList<>();
		for(VoteItemDTO dto : itemDTO) {
			VoteItem item = VoteItem.builder().item(dto.getItem())
												.imageurl(dto.getImageurl())
												.board(board).build();
			list.add(item);
		}
		itemRepository.saveAll(list);
		
		return board.getBno();
	}

기존의 등록 메서드에 파일을 업로드하는 기능을 추가하였다. 파일의 이름은 중복을 방지하기 위해 uuid를 적용하였다.

앞으로의 계획

이제 대략적인 기능들은 구현을 마쳤기에 MVC를 구현해야 하는데 MVC에 대한 이해도가 뒤죽박죽이고 기본적인 지식이 부족하다고 느껴 인프런 강의를 들을 계획이다. 강의를 들으면서 개발을 진행할 수 있다면 할 것이지만 아마도 강의를 완강한 후 진행할 것 같다.

Git

https://github.com/JINJAEHO/VoteProject

profile
Java, Spring, SpringMVC, JPA, MyBatis

0개의 댓글