프록시 서버란? 프록시 서버(Proxy Server)는 서버와 클라이언트 사이에 클라리언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킵니다. 프록시 서버로 쓰는 Nginx Nginx는 비동기 이벤트 기반의 구조와 다수의 연결을 효과적으로 처리 가능한 웹 서버입니다. 주로 Node.js 앞단의 프록시 서버로 활용합니다. 익명 사용자가 직접적으로 서버에 접근하는 것을 차단하고, 간접적으로 한 단계를 더 거치게 만들어서 보안을 강화할 수 있습니다. 실제 포트를 숨길 수 있고, 정적 자원을 gzip 압축하거나, 메인 서버 앞단에서 로깅을 할 수도 있습니다.
@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..
Q. CI/CD에 대해서 설명해주세요 A. 지속적 통합 / 지속적 배포의 개념입니다. CI/CD가 탄생하게 된 배경부터 알아야하는데, 기존의 배포 작업 방식은 Push를 하고 PR을 올리고 Merge를 하고 SNAPSHOT 을 따서 서버에 파일을 보내고 돌아가던 서버를 끄고 다시 전달받은 파일로 서버를 구축하는 과정이 개발자 입장에서 상당히 까다로운 작업이었습니다. 그래서 CI/CD 개념을 도입을 해서 지속적으로 배포가 될 수 있게끔 만들었습니다. Q. CI/CD를 사용했을 때 기대효과가 있을까요? A. 사용자 불만사항이나 개선 사항에 대해서 지속적으로 수정을 할 수 있습니다. 예를 들어 결제 시스템에 오류가 나면 시간이 지날 수록 피해의 크기는 엄청 늘어나게 될 것입니다. 하지만 이런 오류를 고치려고 ..
개요 게시글에 이미지를 등록하는 기능을 구현하기 위해서 ERD 를 작성하는데, 이미지를 여러장 저장하게 하려면 어떻게 할까? 를 생각했다. 게시글을 조회 할 때 게시글 이미지 테이블을 조인해서 이미지를 갖고 오는 것이다. 이렇게하면 배열은 아니지만... 한 게시글에 여러장의 이미지를 저장하는 게 가능한데, 조인을 하기 때문에 성능적으로 굳이..? 싶었다. 그래서 검색을 해봤는데 배열 자료형을 문자열로 변환을 하고 저장을 한다고 한다. 꺼내 쓸 때는 문자열을 다시 파싱해서 배열 자료형으로 만들면 된다. MySQL Ver.5.7.8 / MariaDB Ver.10.2 이상 부터는 JSON이라는 타입을 지원 하는데 이걸 이용해서 Json 형식의 문자열 데이터를 저장하고 그걸 쓰면 된다. { "image":[ "..