지난 글에 이어서 이 글부턴 본격적으로 개발하다가 막힌 점들도 얘기해보고 후기도 작성하겠다.
사실 카카오 로그인을 사전에 공부를 좀 해갔는데 JWT 토큰 생성, 프론트에 넘겨줘야할 정보들이 많고 복잡했다.
액세스 토큰을 주고 이를 DB에 저장하고.. 동주가 원하는 방향에 맞추기 어렵다고 판단했고 파트 교체를 했다.
우선 Entity 설정부터 했다. 우리는 AWS RDS를 사용했다. 인텔리제이에서 어플리케이션을 실행하면 application.yml에
jpa:
hibernate:
ddl-auto: create #create -> update
위와 같이 설정을 해놓았기에 테이블이 자동으로 생성되었다.
ERD를 제대로 그리지 않으니 여기서부터 조금씩 헷갈리기 시작했다... 우선, Foreign key를 나타내는 어노테이션이 @JoinColumn임은 알았는데 여기에 테이블간의 일대다, 일대일, 다대일 관계를 설정해야했다.
이후엔 양방향으로 참조하지 않는, 참조되는 엔티티에도 해당 어노테이션을 양방향 설정해야한다고 배웠다.
이어서 반찬 API를 개발했다.
이전 스터디에서도, 스프링 공부하면서도, 수많은 알고리즘 공부를 통해서도 로직 작성하는 것은 어렵지 않다고 생각해 무난.. 하게 개발할 줄 알았으나 몇 가지 어려움이 있었다.
반찬 엔티티에는 반찬 사진을 업로드해야했는데 사진은 DB에 직접적으로 저장할 수 없으므로 S3에 파일 저장을 해야했다. 따라서, jojoldu님의 블로그와 구글링을 통해 AmazonS3builder 를 사용해 버킷에 파일을 업로드하고 db에는 url만 저장하는 구조로 코드를 작성했다.
jojoldu님 블로그와 각종 구글링을 참고해 코드를 작성했다.
버킷에 파일을 저장하고, 불러오고, 삭제하는 S3Uploader 클래스를 만들었다.
@Slf4j
@Component
public class S3Uploader {
private final AmazonS3Client amazonS3Client;
@Autowired
public S3Uploader(AmazonS3Client amazonS3Client) {
this.amazonS3Client = amazonS3Client;
}
@Value("${cloud.aws.s3.bucket}")
private String bucket;
public String upload(MultipartFile multipartFile, String dirName) throws IOException {
File uploadFile = convert(multipartFile)
.orElseThrow(() -> new IllegalArgumentException("MultipartFile -> File 전환 실패"));
return upload(uploadFile, dirName);
}
private String upload(File uploadFile, String dirName) {
String fileName = dirName + "/" + uploadFile.getName();
String uploadImageUrl = putS3(uploadFile, fileName);
removeNewFile(uploadFile); // 로컬에 생성된 File 삭제 (MultipartFile -> File 전환 하며 로컬에 파일 생성됨)
return uploadImageUrl; // 업로드된 파일의 S3 URL 주소 반환
}
private String putS3(File uploadFile, String fileName) {
amazonS3Client.putObject(
new PutObjectRequest(bucket, fileName, uploadFile)
.withCannedAcl(CannedAccessControlList.PublicRead) // PublicRead 권한으로 업로드 됨
);
return amazonS3Client.getUrl(bucket, fileName).toString();
}
private void removeNewFile(File targetFile) {
if(targetFile.delete()) {
log.info("파일이 삭제되었습니다.");
}else {
log.info("파일이 삭제되지 못했습니다.");
}
}
private Optional<File> convert(MultipartFile file) throws IOException {
File convertFile = new File(file.getOriginalFilename());
if(convertFile.createNewFile()) {
try (FileOutputStream fos = new FileOutputStream(convertFile)) {
fos.write(file.getBytes());
}
return Optional.of(convertFile);
}
return Optional.empty();
}
}
이후 서비스로직을 만들고 어플리케이션을 실행했는데 빈 관련 문제가 발생했다.
AmazonS3Client 빈을 찾을 수 없다. 정의되지 않았다는 에러였다.
그러나, 해당 클래스는 따로 구현하는 것이 아니라 라이브러리에서 자동으로 빈 등록을 한다고 배웠는데 빈 등록이 되지 않았고.. 구현이 되지 않았ㄷㅏ...
S3를 사용한 다른팀을 참고해봤는데 설정이 다 비슷한데도 문제를 발견하지 못해 끝끝내 해당 API를 해결할 수 없었고 API 개발에 실패했다...
그 외에도 사실 많은 어려움이 있었다. 우선 로컬이 아닌 RDS를 같이 쓰다보니 내가 로컬에서 DB에 접근할때와 배포를 위해 접근할때와 포인트가 겹쳐서 아예 localhost:8080에 접속이 되지 않을때도 있었고 소셜로그인도 생각보다 애를 먹어서 5시나 되어서야 구현이 완료되었다. 그러다보니 다른 부분 수정이 늦어지기도 했고 마지막 배포까지 연결이 쉽지 않아서 팀원들이 많이 애를 썼다.
또한 짧은 시간에 발생한 에러를 찾고 에러를 해결하는 과정에서 해결은 되었어도 이게 왜..되지..? 싶은 에러들도 많았다.
서버를 열때 DB세팅에서 막혀가지고 아예 로컬호스트 호출이 안되는 문제등등..
반드시 추후에 원인을 찾아야한다.
그래도 1등이요?
8시가 되고 6개의 조가 발표를 진행했는데 우린 기획도 디자인도 없어서.. 발표자료 만들 사람이 없었고 시연 영상하나에 동주의 발표력으로 발표를 진행했다.
그리고 그결과..! 아무튼 1등..!
이후엔 아침 9시부터 국밥에 소주를 먹고... 2차를 2시까지 갔다가 신촌을 갔다가.. 뭐 낮술엔딩이었다. 헤헤
데모데이 발표를 들어보니 다들 해커톤이 처음이다 보니, 생각보다 연결이 되지 않은팀도 많았고 구현자체에 어려움을 겪은 팀도 많았던 것 같다. 사실 나도 개발 경험이 많지 않아 이번 해커톤에 민폐가 될까해 참여를 하지 않을까 고민했었다. 하지만 언제까지 스스로 능력이 부족하다고 피하기만하면 절대 실력이 늘지 않을거라고 생각해 참여를 결정했다.
우선 내가 부족한 부분을 알 수 있어서 너무 좋았다. 공부를 해도 취준을 해도 항상 드는 느낌은 '내 안에 열망은 가득한데 뭘 해야할지 모르는 답답함이었다.' 뭘 모르는지 몰라 아는 범위내에서 작은 걸음만 걷고 있었고 그 결과 항상 발전하지 못했다.
하지만 이번 해커톤을 하며 내가 생각하던 백, 프론트 연결 개념, 카카오 로그인, 배포, API 개발은 보다 더 어렵고 공부할게 많았고 그 과정에서 사용할 툴도 상당히 많다는 것, 툴 환경설정에 제일 자신 없는 내가 극복해야할일이 많다는 것을 느낄 수 있었다.
참여한 동아리원들을 보면서도 많은 것을 배울 수 있었다. 제대로 구현이 완성된 팀은 없었지만 새벽4시에서 6시, 그리고 아침 8시까지 중간중간에 찍은 사진만봐도 쉬는 팀하나 없고 자는 사람도 없었다. 다들 열정적이었고 팀끼리 경쟁을 한다기보단, 하다가 막히는 부분이 있으면 서로 질문하고 부족하지만 아는 내용과 경험을 공유하며 해결해나갔다.
S3쪽에서 진짜 많이 막혔는데 막히는 부분이 올때마다 누구하나 본인이 잘 모르더라도 의견을 제시해주고 그 의견을 모아 꼬리를 쫓다보니 해결이 되는 문제도 있고 진짜 뿌듯했다.
또한, 건휘를 보며 많은 것을 느꼈다. 개발 경험이 전무함에도 책임감을 가지고 자신이 할 수 있는 역할에 최선을 다했다. 모르는 내용은 강의를 듣기도 하고, 부족하다고 의견제시를 꺼려했던 과거의 나와 다르게 의견제시를 하고 데이터를 찾거나 다른 부분에서 할 수 있는 일을 찾아 팀에 기여했다.
물론..! 이런 금쪽이 나를 데리고 팀을 이끌어준 상민이와 동주한테도 너무 고맙다.
방학부턴 7기가 진행된다. 7주라는 짧은 시간이지만 그 시간안에 간단한 미니프로젝트를 진행해보려고 한다.
부족한 부분을 알고나니 이 방학이 너무 기대가 된다. 내가 배워야할 것, 채워야할 부분을 알게 되어 너무 좋다.
이 부분을 잘채워서 알찬 방학을 시작해봐야겠다.
코테이토 고생했다다들!!!
'활동 > cotato' 카테고리의 다른 글
IT동아리에서 운영진으로 성장하기 - (2) (2) | 2024.08.27 |
---|---|
IT동아리에서 일반 부원으로 성장하기 - (1) (4) | 2024.08.27 |
IT연합동아리 코테이토 교육팀 활동 회고록 (0) | 2024.03.11 |
코테이토 3회차 해커톤 회고록 (1) | 2024.01.18 |
제 1회 코테이토 해커톤 후기 -(1) (0) | 2023.07.03 |