Project/9uin 13

spring boot 사이드 프로젝트 : authenticate에서 발생하는 '자격 증명에 실패하였습니다' 오류 해결

프로젝트 중 로그인 관련해서 마주친 오류에 대한 내용 정리입니다.   마주친 오류는 다음과 같습니다.     해당 오류가 발생한 원인 발생한 원인은 로그인 로직 수정 때문이었습니다.  수정 전 로그인 방식- 이메일, 비밀번호 입력해서 로그인  수정 후 로그인 방식- 아이디, 비밀번호 입력해서 로그인      오류 발생 위치   기존 로그인 과정 코드에서, 이슈가 발생한 부분은 다음과 같습니다. Authentication authentication = authenticationManagerBuilder.getObject().authenticate(usernamePasswordAuthenticationToken);   UsernamePasswordAuthenticationToken으로 생성한 토큰을 넘겨 권..

Project/9uin 2024.04.02

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

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 사이드 프로젝트[8] : 게시글 태그 필터링 (querydsl join)

이전글 https://yoonsys.tistory.com/9 spring boot 사이드 프로젝트[7] : Custom Repository 작성(사용자명, 글제목으로 게시글 검색) JpaRepository를 인터페이스에 상속하면 기본적인 메서드들 (ex. findbyid, findAll) 을 제공하지만, 디테일한 데이터를 쿼리하기 위해서는 내가 직접 작성할 필요가 있었다. 처음에는 다음과 같이 메서드 yoonsys.tistory.com 앞에서는 동적 쿼리를 이용해 사용자 이름, 게시글 이름으로 게시글들을 필터링하는 repository코드를 작성했다. 이번에는 복수의 태그를 이용해 게시글을 필터링해보려 한다. Entity 수정 여기서 중요한 점은 entity의 수정이었다. 게시글 하나에는 여러개의 기술 스..

Project/9uin 2023.06.14

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

spring boot 사이드 프로젝트[6] : querydsl 설정 및 작성

이전에 만든 repository는 JpaRepositroy를 상속받았기에 기본적인 crud 쿼리 메서드들을 사용할 수 있다. 추가로 디테일한 쿼리를 원하면, 우리가 직접 쿼리 메서드를 작성해서 커스텀이 가능하다. 그렇기에 JPQL(Java Persistence Query Language)의 사용이 필연적이게 된다. 문제는 원하는 쿼리가 복잡해질수록 너무 쿼리문자열, 또는 메서드 이름의 길이가길어져 가독성이 떨어지고, 오류도 체크하기 어려워진다. 그렇기에 우리는 querydsl을 사용하기로 결정했다. querydsl 개요 querydsl은 SQL쿼리를 정적 타입을 이용해 생성하게 해주는 프레임워크이다. 이것을 이용하면 다음과 같은 장점이 있다. 1. 자동완성 기능을 사용할 수 있다. 2. 문법이 틀리면 오..

Project/9uin 2023.05.26

spring boot 사이드 프로젝트[5] : service, repository 초기 작성

데이터베이스를 entity를 이용해 다루는 레이어 repository, 그리고 이 repository를 이용해 비즈니스 로직을 구현하는 service레이어의 초기 작성을 한다. user의 repository, service를 작성하기 위해 user도메인 안에 repository, service 패키를 만들어 그 밑에 클래스 파일을 생성한다. Repository 작성 repository는 이렇게 jpaRepository를 상속받은 인터페이스로 생성한다. 이렇게 인터페이스로 만들어도 service에서 의존성 주입을 통해 사용이 가능한 건 spring data jpa가 이 인터페이스를 기반한 구현체를 실행 시 생성해서 프록시 객체로 주입해주는 것 때문이다. 구현체에는 jpaRepository 에 정의되어있는 ..

Project/9uin 2023.05.23

spring boot 사이드 프로젝트[4] : 도메인 엔티티, DTO 설계 및 특별한 패키지 구조

데이터베이스를 설계하기 위해 E-R다이어그램을 기반한 도메인 설계를 시작했다. 보통 스프링 부트 프로젝트들을 보면 service , controller, repository 이렇게 패키지를 나눠서 진행하는 경우가 많은데, 우리는 조금 다른 방식으로 진행했다. domain에 속하는 user, comment, post, profile을 먼저 만들고, 그 안에 controller, service , repository등을 만드는 것이다. 이 패턴의 장점은 각 엔티티와 연관된 레이어를 찾는 것이 굉장히 쉽다는 점이다. 단점은 필요 이상으로 패키지 개수가 늘어날 수 있다는 점인데, 나는 이 패턴을 통해 파일을 찾는 것이 더 유용하다 판단해서 이 방법을 선택했다. 도메인은 크게 User, profile, post,..

Project/9uin 2023.05.22