오류 및 문제점
1. ObjectMapper 리스트 받아오기
- 문제점: 해시태그가 배열 형태로 들어오기 때문에 ObjectMapper를 통해 배열을 받아야 한다.
- 해결 방안: List.class의 형태로 값을 받는다.
List<String> hashtag = mapper.treeToValue(obj.get("hashtag"), List.class)
2. 하위 entity 가져오기
- 문제점: 댓글 entity를 가져올 때 many이기 때문에 불필요한, 중복된 entity들이 join되어 불러진다.
- 해결 방안: 필요한 데이터를 담은 DTO를 생성한다.
- 문제점: 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. 댓글 등록
@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());
conn.setRequestProperty("X-OCR-SECRET", " ");
conn.setDoOutput(true);
ArrayList<JSONObject> imgObjArray = new ArrayList<>();
JSONObject imgObj = new JSONObject();
imgObj.put("format", "jpg");
imgObj.put("name", "영수증1");
imgObj.put("data", encodedString);
imgObjArray.add(imgObj);
JSONObject obj = new JSONObject();
obj.put("version", "V2");
obj.put("requestId", "string");
obj.put("timestamp", 0);
obj.put("images", imgObjArray);
String jsonString = JsonUtil.getObjectToJsonString(obj);
OutputStream os = conn.getOutputStream();
byte[] input = jsonString.getBytes("utf-8");
os.write(input, 0, input.length);
JSONObject resultObj = JsonUtil.getStringToJsonObj(sb.toString());
}
참고 자료