목록전체 글 (51)
백엔드 개발자
스프링 부트에서 파일업로드 관련 rest api를 만들었는데 잘 동작하던게 갑자기 Current request is not a multipart request 이런 오류가 뜨며 동작하지 않았다. 스프링시큐리티 설정을 지워주니 잘 동작하여서 스프링시큐리티 관련해서 찾아보니 뭐 MultipartFilter를 추가해 주라고 했다. 근데 이것도 xml파일로 설정하는 글들이 대부분이어서 더 찾아보니 그냥 기존 @PATCHMAPPING 에서 @PUTMAPPING으로 바꿔주니 잘 동작하였다 ..!! 마찬가지로 @POSTMAPPING도 이거 대신 @PUTMAPPING을 써야하는 것 같다. 그럼 오류 해결 끝~~
싸피 공통프로젝트에서 깃과 지라 관리를 담당하여 컨벤션을 정하고 팀원들과 공유하게 되었다. 커밋 컨벤션과 코딩 컨벤션을 정하고 프로젝트에서 gitlab을 사용하였기 때문에 템플릿 작성까지 정리해보겠다. 커밋 컨벤션 feat : 새로운 기능 추가 fix : 버그 수정 docs : 문서 수정 style : 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우 refactor : 코드 리펙토링 test : 테스트 코드, 리펙토링 테스트 코드 추가 chore : 빌드 업무 수정, 패키지 매니저 수정 feat : oAuth 구글 로그인footer Resolves: #67 -> 꼬리말 Ref: #64 Related to: #33, #34 유형: #이슈 번호 형식으로 작성 유형은 다음 중 하나를 사용 유형 예시 제목..
새벽코딩을 하다가 작성한거 푸시만 해놓고 자야지 했다가 원격 develop 브랜치로 바로 푸시해버렸다 (IDE를 믿지말자..) 원격브랜치에서 커밋을 revert하려면 커밋 하나하나 해주어야 하고 또 그거에 대한 MR도 생성 후 승인이 되어야 해서 다시 커밋을 되돌리는 방법을 찾게 되었다. git set \[커밋 아이디\]를 하면 해당 커밋 시점으로 돌아가게 된다. 그리고 이것을 원격 develop브랜치에 푸시하면 된다. git push -f origin develop커밋이 develop 브랜치 보다 뒤에 있기 때문에 -f 를 써서 강제로 푸시해 주어야 한다. 그런데 나는 바로 푸시하기는 무서워서 원격 develop브랜치에서 test브랜치를 하나 만들어주고 원하는 대로 잘 동작하는지 확인해주었다. 로컬 t..
jenkins ci/cd 환경을 구축했는데 빌드가 실패한지 모르니 서버가 이상한 것 같다는 말이 많이 들려왔다. 그럴때마다 매번 다시 jenkins접속해서 확인을 해주어야 했는데 mattermost 알림 설정을 통해 빌드 결과를 자동으로 보내주도록 했다. 우선 젠킨스 플러그인에서 mattermost notification 플러그인을 설치해주었다. 그리고 젠킨스 시스템 설정에서 웹훅 정보를 등록해주었다. 그럼 우선 웹훅 설정을 해주어야 하기 때문에 메타모스트에서 알림을 줄 채널을 생성하고 해당 채널에 연결될 webhook을 등록해주었다. 원하는 channel 에서 왼쪽 위 메뉴를 눌러 통합 -> 전체 incoming hook을 선택하고 추가버튼을 눌러주었다. 이렇게 이름과 설명을 써주고 채널을 선택한다. ..
저번 프로젝트에서는 freestyle project로 ci/cd 환경을 구성했었다 이번에도 빌드배포 과정이 간단하기 때문에 freestyle project로 구축할 수 있을 것 같았지만 파이프라인이 좀 더 세부적으로 컨트롤 할 수 있고 많이 사용되기 때문에 파이프라인으로 프로젝트를 만들어 주었다. 저번과 달라진 점은 저번 프로젝트에서는 도커 컴포즈 사용 x , 프리스타일 프로젝트 쓰고 보니 별거없네 결론은 이번에는 도커 컴포즈와 파이프라인을 사용하였다. 이번 글에서는 간단하게 저번과 달랐던 점만 적어보면 프리스타일 프로젝트에서는 Execute Shell 을 이용해서 스크립트를 작성했는데 webhook 이 온 기점으로 따로 깃 레포지토리를 클론하거나 하지 않고 바로 작업디렉토리가 깃 레포지토리에서 시작하는..
nginx를 도커 이미지 사용하려다가 인증서 문제로 그냥 설치하는 것으로 바꾸기로 하였다. nginx는 apt install nginx 명령어 한 줄로 설치 가능하기 때문에 이게 더 낫다고 판단했다. nginx설치하여 설정파일 수정하고 실행하는데 이미 할당 되어 있다고 실행이 되지 않았다. 이전에 도커컨테이너로 실행된 것이 문제인가 했는데 아무리 다 지워도 계속 할당이 되어있다고 했다. sudo ss -tuln | grep 80 sudo ss -tuln | grep 443위 명령어로 80, 443 포트에 할당된 프로세스들이 있는지 확인을 하고 sudo KILL -9 [PID]를 해주었는데 해당 프로세스가 없다고 지워지지 않았다. 알고 보니 내가 PID에 해당된다고 생각해서 입력한 값이 PID가 아니었다...
Auditing 등록일, 수정일 같은 공통으로 필요한 속성들을 class 로 정의하여 추가할 수 있도록 해준다. 보통 createdDate 이나 updateDate을 추가해 줄 때 많이 사용한다. (등록자, 수정자도 가능) 기본 jpa에서는 @PrePersist 나 @PreUpdate를 사용해서 구현하는데 스프링 데이터 jpa는 클래스에 @EntityListeners(AuditingEntityListenner.class) 를 추가해주고 각 필드에 @CreateDate, @LastModifiedDate를 추가해 주면 된다. @EntityListeners(AuditingEntityListenner.class) @MappedSuperclass @Getter public class BaseEntity{ @Cre..
공통 인터페이스 CRUD에 해당하는 find, delete 등 많이 쓰이는데 항상 같은 코드를 반복하게 된다. JpaRepository 이것을 우리가 사용할 repository 인터페이스에서 JpaRepository 을 상속받으면 스프링 데이터 JPA에서 구현 클래스를 만들어 인터페이스를 구현한 프록시 객체를 만들어 준다. 우리는 인터페이스를 직접 구현하지 않고 find, findAll 등 지원하는 다양한 메서드를 사용할 수 있다. 메서드 쿼리 공통 인터페이스 말고 우리 도메인에 특화된 쿼리문도 필요할 것이다. 이때 정해진 규칙에 맞춰 메서드 이름을 작성하면 우리 도메인에 해당하는 쿼리로 구현체를 만들어준다. findByName 을 하면 name으로 찾아오는 쿼리를 자동 구현해 줄 것이다. And 로 여..