[프로젝트] 웹 TripRecorder - day09

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

오류 및 문제점

1. Profile file contained no credentials for profile 'default'

  • 문제점: AWS의 자격 증명이 완료되지 않아 객체를 삭제할 수 없다.
  • 해결 방안: AWS CLI를 설치해 aws credentials 파일을 생성한다.

2. RequestBody로 여러 개의 값 받기

  • 문제점: RequestBody로 VO와 다른 키도 받고자 한다.
  • 해결 방안: object를 이중으로 감싼다.
public JSONObject postRegisterSns(HttpServletRequest request, @RequestBody ObjectNode obj) throws JsonProcessingException {
	ObjectMapper mapper = new ObjectMapper();
	Long tripNo = obj.get("tripNo").asLong();
	Long expNo = obj.get("expNo").asLong();
	SnsVO sns = mapper.treeToValue(obj.get("sns"), SnsVO.class);
}

진행 상황

1. 각종 유틸 생성

  • AWS 유틸
    • 이미지 url 얻기
    • 이미지 삭제
  • Encoding 유틸
    • 비밀번호 암호화
    • 비밀번호 확인
    • 문자열 복호화
    • 토큰에서 userNo 얻기
  • Json 유틸
    • 문자열을 JsonObject로 반환
    • 자바 object를 JsonString으로 반환
// AWS - S3Client 생성
public AwsUtil() {
	ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create();
	Region region = Region.AP_NORTHEAST_2;
	this.s3 = S3Client.builder().region(region).credentialsProvider(credentialsProvider).build();
}

// AWS - object url 얻기
public static String getImageURL(String keyName) {
	AwsUtil awsUtil = new AwsUtil();
	GetUrlRequest request = GetUrlRequest.builder().bucket(BUCKET_NAME).key(keyName).build();
	URL url = awsUtil.s3.utilities().getUrl(request);
	awsUtil.s3.close();

	return url.toString();
}

// AWS - objects 삭제
public static void deleteBucketObjects(String[] keyName) {
	AwsUtil awsUtil = new AwsUtil();
	ArrayList<ObjectIdentifier> toDelete = new ArrayList<>();
	for(String key : keyName) {
		toDelete.add(ObjectIdentifier.builder().key(key).build());
	}
		
	DeleteObjectsRequest dor = DeleteObjectsRequest.builder().bucket(BUCKET_NAME)
			.delete(Delete.builder().objects(toDelete).build()).build();
		
	awsUtil.s3.deleteObjects(dor);
		
	awsUtil.s3.close();
}

// 토큰 - userNo 받아오기
public static Long getUserNo(HttpServletRequest request) {
	String jwt = request.getHeader("Authorization");
	String decodeStr = EncodingUtil.getDecodedStr(jwt.replace('.', '@').split("@")[1]);
	JSONObject jsonObj = JsonUtil.getStringToJsonObj(decodeStr);
	return (Long) jsonObj.get("userno");
}

// JSON - Java 객체를 Json 문자열로 변환
public static String getObjectToJsonString(Object obj) throws JsonProcessingException {
	ObjectMapper mapper = new ObjectMapper();
	return mapper.writeValueAsString(obj);
}

2. 로그인 시 프로필 사진 가져오기

String profile = prepo.findById(user.getUserNo()).orElse(null).getProfilePhoto();
String profileUrl = AwsUtil.getImageURL(profile);

3. 게시글 등록

  • 영수증을 먼저 등록한 경우 영수증 번호를 등록해야 함
  • 해시태그가 있는 경우 해시태그를 입력해야 함
    • 해시태그를 배열로 받아오도록 변경 필요
@PostMapping("/register")
public SnsVO postRegisterSns(@RequestBody ObjectNode obj) throws JsonProcessingException {
	// Object로부터 각 값을 뽑아옴
	ObjectMapper mapper = new ObjectMapper();
	Long tripNo = obj.get("tripNo").asLong();
	Long expNo = obj.get("expNo").asLong();
	String hashtag = obj.get("hashtag").asText();
	SnsVO sns = mapper.treeToValue(obj.get("sns"), SnsVO.class);
		
    // 해시태그는 배열로 들어가기 때문에 List 선언 후 '#'을 추가해 저장
	List<HashtagVO> tagList = new ArrayList<>();
	String[] tags = hashtag.split("@");
	for(String tag : tags) {
		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));
		
	SnsVO savedSns = srepo.save(sns);
    
    // 미리 작성된 영수증이 있는 경우 현재 작성한 게시글과 연결
	erepo.findById(expNo).ifPresent(exp -> {
		exp.setSns(savedSns);
		erepo.save(exp);
	});
		
	return sns;
}

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글