목록분류 전체보기 (40)
백엔드 개발자
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 로 여..
임베디드 타입 ( 값 타입 ) 식별자가 없다. 한 엔티티안에 종속되어 라이프 사이클도 종속된다. 엔티티가 삭제되면 함께 삭제된다. CasCadeType.ALL && 고아객체로 설정한 것과 같다. 식별자가 없으므로 추적도 불가능 하다. JPQL 객체지향 쿼리언어이다. SQL을 추상화한 언어이기 때문에 특정 데이터베이스에 종속되지 않는다. 문법은 sql 과 거의 유사하다. JPQL 문법 COALESCE : null 값인 경우 반환 값 지정 ⇒ coalesce(m.name, ‘이름 없는 회원’) NULLIF : 조건에 맞으면 null 반환 ⇒ NULLIF(m.name, ‘홍길동’) 이름이 홍길동이면 null 반환 CONCAT : 문자열 더하기 concat(’a’, ‘b’) SUBSTRING : 시작위치, 길이..
N + 1 문제 JPA를 이용하여 객체지향적인 설계가 가능해지는데, 엔티티 안에 엔티티를 포함할 경우 한 번 엔티티를 호출하는 것이 해당 엔티티에 포함된 다른 엔티티까지 호출하게 되면서 쿼리가 한 번 혹은 그 이상 더 호출하는 문제가 생기게 된다. JPQL을 사용할 때 발생하게 되는데(jpa에서 지원하는 find는 최적화를 통해 join으로 호출한다) JPQL을 SQL로 변환하여 호출하고 그 안에 필요한 값들을 추가로 호출하게 되는 것이다. 모든 값이 다 필요한 경우라면 모두 조회할 필요가 있지만 그게 아니라면 쓸데없는 호출이 생기는 것이다. 그래서 지연로딩인 FetchType.LAZY 설정을 통해 실제 조회하여 가져오는 것이 아닌 프록시 객체인 빈 껍데기를 넣어 만들어준다. 이것도 결국 모두 조회가 필..
객체와 테이블 매핑 @Entity 엔티티 선언 @Id : primary key 매핑, @GeneratedValue : 키 생성방법 지정, strategy 설정해줄 수 있다. 기본적으로 GenerationType.Auto 가 디폴트 값이다. GenerationType 의 종류 IDENTITY - auto increment 방식 (이 경우 jpa 영속성 컨텍스트에 들어갈 때 id 값이 있는 상태여야 하므로 커밋시점이 아닌 저장메서드를 호출할 때 바로 db로 저장이 된다. SEQUENCE - DB에 저장되어있는 마지막 키값을 불러와 그 다음 값으로 id 설정. (allocationSize를 설정하여 미리 사용할 키값들을 정해놓은 후 사용가능. 매번 db를 조회하지 않아도 됨) TABLE AUTO AUTO는 데..