반응형 전체 글297 LEFT JOIN, INNER JOIN 차이 프로젝트로 게시판을 만들면서 각 카테고리에 따라 테이블을 나누어 작성한 후, 정보를 가져오는 경우 테이블을 합치는 경우가 있다. 이 때 JOIN 을 사용하게 되는데, 그 중 많이 사용하는 LEFT JOIN 과 INNER JOIN에 대해 알아보겠습니다. 게시판의 댓글과 게시글을 이용해서 예시를 들것입니다. 이 때 사용할 DBMS는 MYSQL 이다. OUTER JOIN - 합집합 LEFT JOIN은 OUTER JOIN 의 일종이다. 따라서 LEFT OUTER JOIN 이라고 볼 수 있다. OUTER JOIN 은 합집합을 의미한다. 여기서 LEFT JOIN은 왼쪽의 모든 행을 조회한다. select * from post left join comment on post.id = comment.post_id; 따라.. DBMS/MySQL 2024. 1. 6. [SpringBoot] Redis Hash 구조로 변경하기 Issue 이전 포스팅에서 레디스와 스케쥴러를 이용해서 DB에 주기적으로 업데이트를 진행했다. https://miiro-under.tistory.com/261 레디스와 스케쥴러를 이용한 조회수 증가 Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션(Session)을 사용했다. https://miiro-under.tistory.com/260 조회수 기능 구현하기 - 중복 방지(Session) Issue 이전 포스팅에서 조회수 기능을 중 miiro-under.tistory.com 해당 로직에 대한 피드백을 받았는데, 기존에는 redisService.hasKeys(VIEW_PREFIX + "*") 연산을 진행했었다. 해당 연산은 VIEW_PREFIX 라는 키를 가진 모든 키를 로드하는 방식.. Spring/Issue 2024. 1. 5. [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported] 에러 해결하기 DTO와 MultipartFile을 요청하는 create 로직에서 해당 에러가 났다. @RequestBody에서 @RequestPart로 어노테이션을 바꿔주고 @RequestPart(required = false) 와 함께 MultipartFile files 를 추가해준 상황이었다. 포스트맨에서는 내가 작성한 커스텀 에러가 나서 인텔리제이의 콘솔창을 확인해봤습니다. 에러 문구를 확인해보면 'Content-Type 'application/octet-stream' is not supported' 로 미디어 타입이 잘 못 되었다는 것을 확인할 수 있다. 원래는 file을 받기 전에는 포스트맨에서 raw -> Json 타입으로 데이터를 전송했었다. 하지만 file을 보내주면서 form-data 형식으로 변경해준.. Spring/Issue 2024. 1. 5. @RequestBody vs @RequestParam vs @RequestPart 토이프로젝트를 진행 중인데 파일을 업로드 하고 싶을 때 요청을 받을 때 어떤 구문을 사용해야하는지 알아보다가 @RequestPart 문에 사용해야한다는 것을 알았습니다. HTTP 요청할 때 사용하는 어노테이션인 @RequestBody 와 @RequestPart 더불어 @RequestParam 각각 특징에 대해 알아보겠습니다. @RequestParam RequestParam은 Servlet request 파라미터에 접근하기 위해 사용한다. MultipartFile 과 같은 것들도 동일하게 작동한다. 단, 파라미터가 String이나 MultiFile이 아닌 경우, Converter 나 PropertyEditor에 의해 처리된다. 1개의 HTTP 요청 파라미터를 받기 위해서 사용하며, 파라미터 여부가 defa.. Spring/스프링 이론 2024. 1. 5. 레디스와 스케쥴러를 이용한 조회수 증가 Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션(Session)을 사용했다. https://miiro-under.tistory.com/260 조회수 기능 구현하기 - 중복 방지(Session) Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션 쿠키(Session-Cookie)를 사용했다. https://miiro-under.tistory.com/259 조회수 기능 구현하기 - 중복 방지(Cookie) Issue 커뮤니티 서비스를 구현 miiro-under.tistory.com 현재 로직의 경우 게시글을 조회할 때마다 DB에 조회수를 증가하는 카운팅을 쓰는 작업을 수행하고 있습니다. 하지만 조회수만 증가를 시키는 게 목적인데, 요청마다 테이블을 조회해서 불필요한 쿼.. Spring/Issue 2024. 1. 3. 조회수 기능 구현하기 - 중복 방지(Session) Issue 이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션 쿠키(Session-Cookie)를 사용했다. https://miiro-under.tistory.com/259 조회수 기능 구현하기 - 중복 방지(Cookie) Issue 커뮤니티 서비스를 구현하는 토이프로젝트를 진행하면서 게시판의 조회수를 증가 로직을 만드려고 합니다. 게시글이 조회될 때마다 조회수를 증가하는 게 가능하지만 동일 사용자에 한해 miiro-under.tistory.com 세션 쿠키는 사용자가 웹 사이트를 탐색하는 동안 생성되고 유지되며, 브라우저가 닫히면 삭제가 된다. 그런데 현재 나는 RESTful API를 구현하는 시나리오로 해당 토이프로젝트를 진행 중이다. RESTful API의 경우, 클라이언트와 서버 간 통신이.. Spring/Issue 2024. 1. 2. 조회수 기능 구현하기 - 중복 방지(Cookie) Issue 커뮤니티 서비스를 구현하는 토이프로젝트를 진행하면서 게시판의 조회수를 증가 로직을 만드려고 합니다. 게시글이 조회될 때마다 조회수를 증가하는 게 가능하지만 동일 사용자에 한해서 조회수가 중복이 될 수 있기 때문에 해당 조회수 중복을 어떻게 방지할 수 있을지 알아보겠습니다. 일반적인 커뮤니티의 조회수 집계 방법은? 네이버 블로그를 확인해보겠습니다. 네이버 블로그는 조회수(포스트 방문 횟수) 는 30분 이내의 재방문은 가산되지 않는다. 티스토리를 알아보겠습니다. 티스토리는 방문자수와 조회수를 둘 다 제공하여 조회수를 판별할 수 있게 했다. 현재 구현하려는 서비스의 경우에는 블로그 개념이 아닌, 개별 글의 조회수를 제공할 예정이기에 방문자 수는 제공하지 않고, 하루 기준으로 중복 조회 기준이 리셋되.. Spring/Issue 2024. 1. 2. Java 8 LocalDateTime Serialization, Deserialization 이슈 Issue 토이프로젝트를 진행하면서 생긴 LocalDateTime 직렬화/역직렬화에 관한 이슈가 발생했다. 게시글을 조회할 때에 게시글의 작성 시간을 Dto에 주입해서 리턴하는 것을 구현하는 것을 추가하는 와중에 createdAt(생성시간) 을 리턴할 때 값이 받아오지 않고 예외가 발생했다. Problem Exception is occurred.org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class java.time.LocalDateTime] 에러 내용에서 확인해보면 LocalDateTime의 타입이 맞지 않아서 에러가 발생한 것으로 보인다. 그럼 타입을 맞춰보기 .. Spring/Issue 2024. 1. 1. SpringBoot Swagger 3.x.x 적용하기 SpringBoot 3.x.x Swagger 적용 SpringBoot 버전을 3.0.0 이상 사용하는 프로젝트에서 Swagger를 도입할 때 사용해야하는 Swagger 라이브러리에 대해 알아보겠습니다. 기존 SpringBoot 3.0.0 이하 버전인 경우 이전 포스팅에서 확인하실 수 있습니다. https://miiro-under.tistory.com/209 Swagger - REST API 명세 문서화 명세 문서화 명세 : 해당 API가 어떤 로직을 수행하는지 설명하고 이 로직을 수행하기 위해 어떤 값을 요청하며 이에 따른 응답값으로는 무엇을 받을 수 있는 지 정리한 자료이다. API는 개발 과정 miiro-under.tistory.com 의존성 라이브러리 설정 SpringBoot 3.0.0 이상부터는 .. Spring/스프링 이론 2023. 12. 31. [Redis] Redis를 이용한 캐시 활용하기 캐시(Cache) 란? 사용자에 입장에서 데이터를 더 빠르게, 더 효율적으로 엑세스 할 수 있는 임시 데이터 저장소를 뜻한다. 대부분의 어플리케이션에서 속도 향상을 위해 캐시를 사용한다. 캐시를 유용하게 사용하는 방법 캐시 저장소에 접근하는 속도가 원본 데이터 저장소(운영 DB)에 접근하는 속도보다 빨라야한다. 동일한 데이터에 대해 반복적으로 엑세스하는 상황이 많을 때 사용하는 것이 좋다. 즉, 데이터 재사용 횟수가 한 번 이상이어야 cache를 사용하는 의미가 있다. 잘 변하지 않는 데이터 일수록 cache를 사용할 때 효율적이다. 캐시로 Redis를 선택한 이유? 서버가 이중화가 되어 있기 때문에 캐시 데이터 일관성을 위해 원격 캐시를 사용한다. 단순한 key-value 구조로 다양한 자료구조(Str.. DBMS/Redis 2023. 12. 30. [Redis] 레디스란 무엇인가? Redis(Remote Dictionary Server) Redis는 Remote(원격)에 위치하고 프로세스로 존재하는 In-Memory 기반의 Dictonary(key-value) 구조 데이터 관리 시스템이다. 여기서 key-value 구조 데이터란? mysql과 같은 관계형 데이터가 아닌 비관계형 구조로서 데이터를 그저 '키-값' 형태 로 단순하게 저장하는 구조를 칭한다. 그래서 관계형 데이터베이스와 같이 쿼리연산을 하지 않지만, 대신 데이터의 고속 읽기와 쓰기에 최적화 되어있다. 그렇기 때문에, Redis는 일종의 NOSQL 로 분류 되기도 한다. 여기서 말하는 NOSQL 이란? 비관계형 데이터베이스로 데이터의 저장 및 검색을 위해 특화된 매커니즘을 제공하는 데이터 저장기술을 의미한다. 단순 검색 .. DBMS/Redis 2023. 12. 30. 페이징(Paging) 성능 개선 테스트 페이징 성능 개선 현재 토이프로젝트로 축구 커뮤니티 서비스를 개발하고 있습니다 https://github.com/kdmin0706/AmKorea GitHub - kdmin0706/AmKorea: 축구 정보 커뮤니티 축구 정보 커뮤니티. Contribute to kdmin0706/AmKorea development by creating an account on GitHub. github.com 게시글의 페이징을 구현하면서 문득, 대용량 데이터 를 가진 경우에는 기존 처리 방법과 똑같이 해도 되는지에 대해 궁금증이 생겨 테스트를 진행했다. 1. 기존 페이징 (offset) 기존 API 로직에 대해 살펴보겠습니다. Controller 로직으로 Pageable 객체와 검색하는 Title을 PathVariable.. Spring/Issue 2023. 12. 29. 이전 1 2 3 4 5 6 7 8 ··· 25 다음