@Override @Transactional public void deletePost(Member member, Long postId) { Post post = findPost(postId); // repository에서 Post 찾기 checkPostWriter(member, post); // Post의 작성자가 Member가 일치하는 지 s3ImageServiceImplV1.deleteImageUrlList(post.getImageUrl()); // S3에서 이미지 객체 삭제 post.deletePost(); // Post isDeleted 컬럼 true로 바꾸기 } 내가 작성했던 코드다 해당 코드를 보면 Transactional 이 달려있고 S3에서 이미지를 삭제하는 메서드가 있다. 문제 Entit..
NoSQL 특징 NoSQL은 비관계형 데이터베이스입니다. 스키마가 존재하지 않고 Map 형태로 Key Value 로 이루어져 있으며 관계형 데이터베이스와 달리 PK, FK 등의 관계를 정의 하지 않습니다. 장점 데이터 모델링이 유연합니다. 관계형 데이터베이스에 비해 쓰기와 읽기 성능이 빠릅니다. 최적화된 키 값 저장 기법을 사용해서 응답속도나 처리효율 등에서 성능이 뛰어납니다. 단점 데이터 중복을 계속 업데이트해야 합니다. RDBMS RDBMS는 관계형 데이터베이스입니다. 스키마가 존재하며, Row와 Column 으로 구성되어 있습니다. PK, FK 로 관계를 정의 할 수 있고 PK로 데이터 무결성을 보장하며, FK로 참조 무결성을 보장합니다. 데이터가 이미 정해진 스키마에 따라 저장이 되며 관계를 통해..
S3 버킷의 객체를 삭제하는 방법은 AmazonS3 의존성을 이용해 안에 있는 메서드로 지워주면 된다. 나는 현재 이런 방식으로 저장하고 있는데... { "0": "https://amazonawss3.com/UUID", "1": "https://amazonawss3.com/UUID" } 여기서 value의 uuid(객체 이름)만 가져와서 삭제하라고 하면 된다. @Override public void deleteImageUrlList(Map originalImageUrl) { for(int i = 0; i < originalImageUrl.size(); i++) { String[] urlSplit = originalImageUrl.get(i).toString().split("/"); String objec..
쿼리 최적화란 성능이 낮은 쿼리의 응답 속도를 개선하는 작업입니다. SELECT 에는 꼭 필요한 컬럼만 WHERE절에 가급적이면 별도의 연산을 하지않는 것을 권장여기서 Inefficient 쿼리의 경우, Full Table Scan을 하면서 모든 Cell 값을 탐색하고, 수식을 건 뒤, 조건 충족 여부를 판단해야 합니다. 반편 Improved 쿼리의 경우 기존에 r.value 가 가지고 있는 index를 그대로 활용할 수 있기 때문에 모든 필드 값을 탐색할 필요가 없어 Inefficient 쿼리 대비 더 짧은 러닝 타임을 가질 수 있다. -- Inefficient SELECT m.id, ANY_VALUE(m.title) title, COUNT(r.id) r_count FROM movie m INNER J..
RequestDto public record PostCreateRequestDto( Category category, @Size(max = 50, message = "제목은 최소 1자 이상, 최대 50자 까지 입력 할 수 있습니다.") @NotBlank(message = "제목은 필수 입력란입니다.") String title, @Size(max = 1000, message = "글 내용은 최소 1자 이상, 최대 1000자 까지 입력 할 수 있습니다.") @NotBlank(message = "글 내용은 필수 입력란입니다.") String content, List imageUrlList ) { } PostService public Long createPost(Long memberId, PostCreateRe..
오늘 깊게한 고민이다. 개요 팀 프로젝트 진행 중, Entity에 대한 생성을 어떻게 할 것인지 고민을 많이 했다. 우선 생성 방식은 정적 팩토리 메서드를 사용하기로 했다. 이유는 다음과 같다. 생성자를 쓰는 것보다 이름을 갖게 할 수 있어서 의미가 더욱 명확해진다. 말고도 더 많은 장점이 있지만 가장 큰 이유가 저거라고 판단했다. 근데 여기서 고민이 됐던게 // 1. public static User from(UserCreateRequestDto requestDto) { return User.builder() .username(requestDto.username()) .password(requestDto.password()) .build(); } // 2. public static User from(S..