SpringBoot 7

spring boot 사이드 프로젝트 : 채팅기능을 위한 stomp 적용

프로젝트의 요구사항 중 같은 프로젝트에 소속되어있는 인원들끼리 이용할 수 있는 채팅방을 구현해야하는 요구사항이 있었다. 이를 구현해보기 위해 공부한 내용을 정리한다.  rest api 를 사용한 프로젝트에서 채팅은 http를 이용해서 구현할 수 있을까? 가능은 해도 매우 비효율적일 것이다. 이는 http의 특성을 보면 알 수 있다. 1.  클라이언트 - 서버 구조 : 서버에서는 클라이언트의 요청이 와야 응답을 한다. 그 전까지 서버는 대기한다. 2. stateless  :  http를 이용해 클라이언트에서 서버로 한 번 요청과 응답을 주고 받았어도, 서버에서는 http 요청했던 클라이언트의 상태를 저장하지 않는다. 3. connectionless : 한 번 요청 후 응답을 받으면 클라이언트와 서버 간 연..

spring boot 사이드 프로젝트: DockerFile, docker-compose.yml 작성 및 클라우드 세팅(GCP) 2

이 글은 다음글에서 이어진다. https://yoonsys.tistory.com/22 spring boot: DockerFile, docker-compose.yml 작성 및 클라우드 세팅(GCP) 1 프로젝트 작성이 거진 다 끝나고, 테스트와 기능 개선 과제, 그리고 배포 정도의 과제가 남았다. 이제 로컬로 개발서버를 여는 것 뿐 아니라 클라우드 인스턴스에 24시간 배포를 시작해보려 한다 yoonsys.tistory.com gcp에 접속할 준비가 끝났다면, 이제 들어가서 세팅해볼까 싶다. 하지만 가장 중요한 부분인 포트 열기와 고정 ip할당 받기가 남아있다. 기본적으로 스프링 부트에서 사용하는 8080포트를 열지 않으면 외부에서 8080으로 접속을 시도해도 막히게 될 것이다. 포트 열기 위와 같이 메뉴에..

Project/9uin 2023.10.30

spring boot 사이드 프로젝트: DockerFile, docker-compose.yml 작성 및 클라우드 세팅(GCP) 1

프로젝트 작성이 거진 다 끝나고, 테스트와 기능 개선 과제, 그리고 배포 정도의 과제가 남았다. 이제 로컬로 개발서버를 여는 것 뿐 아니라 클라우드 인스턴스에 24시간 배포를 시작해보려 한다. 클라우드 서비스는 가장 대중적인 아마존의 AWS, 마이크로소프트의 Azure, 구글의 GCP 등등 여러가지가 존재하는데, 나는 여기서 GCP를 선택했다. 이유는 단순하게도 무료로 이용이 가능해서(...) 이다. 다른 서비스는 무료를 더 이상 쓸 수 없는 상황.. 당장 복잡한 클라우드 아키텍처를 설계하지는 않았다. 일단 가볍게 다음과 같은 구조를 생각했다. GCP인스턴스 하나를 실행해서 그 안에 도커를 이용해 3개의 컨테이너를 띄운다. 8080으로 요청을 보내면 설정을 통해 스프링 부트 애플리케이션이 실행중인 컨테이..

Project/9uin 2023.10.30

spring boot 사이드 프로젝트 : spring boot + github action을 통해 CI/CD구축

ci/cd란 continuous integration / continuout deploy(delivery) 의 줄임말로, 지속적 통합과 배포를 말한다. 스프링 예제를 하나라도 해보면 알겠지만 서버 코드를 업데이트 했다고 실행중인 애플리케이션에 바로 적용되지는 않고, 서버를 껐다 켜야 업데이트한 코드가 적용된다. 개발서버와 배포 서버를 따로 둔 상황에서 업데이트 내용을 적용하려면 배포 서버에 직접 접속해서 git pull이나 docker pull같은 작업을 거친뒤 다시 서버를 껐다 켜야되는데 서버가 한 두대면 모를까 여러대면 이런건 고역이 따로 없다. ci/cd를 통해 이런 작업을 할 필요 없이, 트리거만 충족되면 배포 서버에도 업데이트한 내용이 바로 적용되고, 다시 배포를 알아서 시작해준다. 프로젝트 마..

Project/9uin 2023.10.29

spring security : refresh 토큰 구현(redis 활용)

jwt 토큰을 통해 로그인을 구현하면 세션에 비해 서버에 부담이 적고, 확장하기도 편리하다는 장점이 있다. 하지만 온전히 사용자가 보내는 http 메시지에 담긴 토큰을 기반으로 서버가 유저를 판단하기 때문에, 이 토큰이 탈취당하면 탈취자를 사용자로 오인하게 되어 매우 위험하다. 프로젝트에서 이를 극복하기 위해 refresh 토큰을 도입했다. Refresh Token 이란? 이전에 작성한 jwt토큰을 이용한 로그인 방식은 엄밀히 보면 access를 위한 토큰이라 볼 수 있다. 그래서 사람들은 보통 이 토큰을 access token이라 지정하는 경우도 많다. 문제는 이 토큰이 탈취당하면 리스크가 크다는 점인데, 이는 access 토큰의 유효시간을 짧게 설정해서 보완할 수 있다. 유효시간이 짧다면 공격하는 사..

springboot 사이드 프로젝트[9] : controller 작성

사용자와 상호작용을 위한 controller 레이어를 만들었다. 기본적으로, 이 프로젝트에 구현한 대부분의 컨트롤러는 이렇게 crud하는 구조를 가진다. (물론, 특수한 로직을 사용해야하는 경우 추가로 다른 구조로 작성되었다.) 가장 자주 사용되는 게시글 api를 살펴보자. Board controller BoardController.java @RestController @RequestMapping("/boards") @Tag(name = "board", description = "게시글 관련 api") public class BoardController { private BoardService boardService; private static final Logger log = LoggerFactory...

Project/9uin 2023.09.04

spring boot 사이드 프로젝트[7] : 게시글 검색 기능 구현, 동적 쿼리 적용

JpaRepository를 인터페이스에 상속하면 기본적인 메서드들 (ex. findbyid, findAll) 을 제공하지만, 디테일한 데이터를 쿼리하기 위해서는 내가 직접 작성할 필요가 있었다. 처음에는 다음과 같이 메서드들을 나눠서 작성했었다. CustomPostRepositoryImpl.java @Override public Page findAllPost(Pageable pageable) { List content = jpaQueryFactory .selectFrom(qPost) .orderBy(qPost.createAt.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); JPAQuery count = getCo..

Project/9uin 2023.06.13