[프로젝트] 웹 TripRecorder - day10

_bean_·2023년 6월 15일
0
post-thumbnail

오류 및 문제점

1. ObjectMapper 리스트 받아오기

  • 문제점: 해시태그가 배열 형태로 들어오기 때문에 ObjectMapper를 통해 배열을 받아야 한다.
  • 해결 방안: List.class의 형태로 값을 받는다.
List<String> hashtag = mapper.treeToValue(obj.get("hashtag"), List.class)

2. 하위 entity 가져오기

  • 문제점: 댓글 entity를 가져올 때 many이기 때문에 불필요한, 중복된 entity들이 join되어 불러진다.
  • 해결 방안: 필요한 데이터를 담은 DTO를 생성한다.

3. java.net.MalformedURLException: no protocol: "URL"

  • 문제점: RequestBody를 String으로 설정해 json 문자열 형태의 URL이 생성되었다.
  • 해결 방안: RequestBody를 String에서 JSONObject로 변경한다.

진행 상황

1. 게시글 등록

  • 해시태그 배열로 받아오기
@PostMapping("/register")
public String postRegisterSns(@RequestBody ObjectNode obj) throws JsonProcessingException {
	ObjectMapper mapper = new ObjectMapper();
	Long tripNo = obj.get("tripNo").asLong();
	Long expNo = obj.get("expNo").asLong();
	List<String> hashtag = mapper.treeToValue(obj.get("hashtag"), List.class);
	SnsVO sns = mapper.treeToValue(obj.get("sns"), SnsVO.class);

	List<HashtagVO> tagList = new ArrayList<>();

	for (String tag : hashtag) {
		HashtagVO t = HashtagVO.builder().htHashtag("#" + tag).sns(sns).build();
		tagList.add(t);
	}

	if (tagList.size() > 1) {
		sns.setHashtag(tagList);
	}

	trepo.findById(tripNo).ifPresent(trip -> sns.setSns(trip));
	if (sns.getSnsContent().equals("")) {
		sns.setSnsContent(null);
	}

	SnsVO savedSns = srepo.save(sns);
	erepo.findById(expNo).ifPresent(exp -> {
		exp.setSns(savedSns);
		erepo.save(exp);
	});

	return "OK";
}

2. 댓글 등록

  • 댓글 내용을 Dto로 생성
@PostMapping("/register/{snsNo}")
public ReplyDto postRegisterReply(HttpServletRequest request, @RequestBody ReplyVO reply, @PathVariable Long snsNo) {
	Long userNo = EncodingUtil.getUserNo(request);
	reply.setUser(urepo.findById(userNo).orElse(null));
	reply.setSns(srepo.findById(snsNo).orElse(null));
	ReplyVO savedReply = rrepo.save(reply);
		
	ReplyDto myReply = ReplyDto.builder()
			.userNo(savedReply.getUser().getUserNo())
			.snsNo(savedReply.getSns().getSnsNo())
			.replyNo(savedReply.getReplyNo())
			.replyContent(savedReply.getReplyContent())
			.replyRegdate(savedReply.getReplyRegdate())
			.build();
	return myReply;
}

3. 게시글 좋아요 등록 및 취소

  • 좋아요 누르면 좋아요 등록하기
  • 이미 좋아요를 누른 상태라면 좋아요 취소하기
@PostMapping("/register/{snsNo}")
public boolean postRegisterHeart(HttpServletRequest request, @PathVariable Long snsNo) {
	Long userNo = EncodingUtil.getUserNo(request);
	boolean result = true;
		
	MultiKey key = MultiKey.builder()
			.user(userNo)
			.sns(snsNo)
			.build();
	HeartVO heart = hrepo.findById(key).orElse(null);
		
	if(heart == null) {
		HeartVO h = HeartVO.builder()
				.user(urepo.findById(userNo).orElse(null))
				.sns(srepo.findById(snsNo).orElse(null))
				.build();
		hrepo.save(h);
	} else {
		hrepo.delete(heart);
		result = false;
	}
		
	return result;
}

4. 이미지 인코딩 및 영수증 데이터 추출 돕기

  • 이미지 인코딩과 데이터 추출 로직 합치기
  • java에서 request 요청 보내기
@PostMapping("/imgrequest")
public JSONObject processReceipt(@RequestBody JSONObject imageObj) throws IOException {
	// 인코딩할 이미지 주소 가져오기
	URL urlInput = new URL(imageObj.get("imageUrl").toString());
    
    // 다시 request를 보내기 위한 설정
    conn.setRequestProperty("X-OCR-SECRET", " ");
	conn.setDoOutput(true);
    
    // requestBody json 형태로 생성
    // 이미지
    ArrayList<JSONObject> imgObjArray = new ArrayList<>();
	JSONObject imgObj = new JSONObject();
	imgObj.put("format", "jpg"); 
	imgObj.put("name", "영수증1");
	imgObj.put("data", encodedString);
	imgObjArray.add(imgObj);
    // RequestBody
	JSONObject obj = new JSONObject();
	obj.put("version", "V2");
	obj.put("requestId", "string");
	obj.put("timestamp", 0);
	obj.put("images", imgObjArray);
    
    // RequestBody 작성
	String jsonString = JsonUtil.getObjectToJsonString(obj);
    OutputStream os = conn.getOutputStream();
	byte[] input = jsonString.getBytes("utf-8");
	os.write(input, 0, input.length);
    
    // BufferReader로 가져온 ResponseBody 다시 Json object로 변환
    JSONObject resultObj = JsonUtil.getStringToJsonObj(sb.toString());
}

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글