개요 게시글에 이미지를 등록하는 기능을 구현하기 위해서 ERD 를 작성하는데, 이미지를 여러장 저장하게 하려면 어떻게 할까? 를 생각했다. 게시글을 조회 할 때 게시글 이미지 테이블을 조인해서 이미지를 갖고 오는 것이다. 이렇게하면 배열은 아니지만... 한 게시글에 여러장의 이미지를 저장하는 게 가능한데, 조인을 하기 때문에 성능적으로 굳이..? 싶었다. 그래서 검색을 해봤는데 배열 자료형을 문자열로 변환을 하고 저장을 한다고 한다. 꺼내 쓸 때는 문자열을 다시 파싱해서 배열 자료형으로 만들면 된다. MySQL Ver.5.7.8 / MariaDB Ver.10.2 이상 부터는 JSON이라는 타입을 지원 하는데 이걸 이용해서 Json 형식의 문자열 데이터를 저장하고 그걸 쓰면 된다. { "image":[ "..
드디어 대망의 CD 구현하기다. 우선 알아야 하는 것이 DockerHub와 이미지 docker-compose .env 파일 Dockerfile 깃허브 액션 yml 코드로 보자 # DockerHub 로그인 - name: DockerHub Login uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} # Docker 이미지 빌드 - name: Docker Image Build run: docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} . # DockerHub Push - ..
오늘은 깃 액션으로 CI를 도전했다. 젠킨스와 깃 액션 중, 어떤 걸 할까 고민을 많이 했는데 깃 액션으로 하기로 했다. 이유는? GitHub와 통합 되어있음 젠킨스는 따로 서버를 열어야하고 WebHook을 사용해서 깃허브에서 푸쉬 된 걸 잡아주는 설정을 해야한다. 근데 깃허브는 그런 거 설정 안해도 된다. 따로 서버를 안 올려도 되니, 푸쉬하는 시간을 자유롭게 할 수 있음 템플릿 존재 깃허브 액션은 템플릿이 존재한다. 각종 상황에 맞게 템플릿을 선택하고 응용해서 사용이 가능 엄청 깊게 들어가지 않을 것이니, 템플릿이 존재하면 좋음 yml 파일로 설정 적응하면 읽기 쉬워진다. 엄청 읽는 거 근데 적응하는데 1시간도 안 걸린다. name: Gradle Package on: push: branches: [d..
통합 테스트 코드를 짜는 중에 환경 변수를 못읽어서 계속 스트레스 받고 있었다.. Application Run 때는 환경 변수를 잘 읽어오는데, 왜 안 되는 거냐...ㅠㅠ 검색해도 안 나오고, 해결법 같은 것들 아무리 해봐도 고쳐지지 않고 그래서 테스트 코드 돌릴 때만 properties에 쌩값 넣어서 작업 하고 있었는데 너무 불편해서 직접 인텔리제이 뒤져보면서 찾았다.. 문제 정의 (원인) 사실 수집 통합 테스트 환경 ActiveProfiles 셋팅을 해줬는데도, 환경 변수를 못 읽어서 실행이 안 되는 오류가 발생했다. java.lang.RuntimeException: Driver org.h2.Driver claims to not accept jdbcUrl, ${TEST_DB_URL} at com.za..
로컬에서 특정한 브랜치에 푸쉬를 한다. 깃허브에서 푸쉬가 된 걸 Jenkins가 Webhooks 으로 캐치를 해준다. CI 작업 (그레이들을 쓴다면 빌드) 후 통과면 ssh 명령어로 development.sh 실행 시키게 한다. development.sh 에는 순서대로 이거 해라~ 하는 명령어가? 서버 중지 -> jar 파일 삭제 -> 도커 허브 jar 다운로드 -> jar 파일 실행 (배포) 순이다. CI/CD 툴이 젠킨스만 있는 것은 아니다, GitAction도 있고, 코드 쉽도 있고... 오늘은 여기서 끝
오늘 통합 환경 테스트 코드를 작성하면서, 갑자기 헷갈린 게 있는데, 단위 테스트랑 통합 환경 테스트가 헷갈렸다. 어디서 헷갈렸나!!!! 나는 통합 환경 테스트를 서비스 레이어 부터 DB까지 건들이는 테스트 코드로 짜고 있었는데 내가 지금 단위 테스트를 하는 건가? 통합 환경 단위 테스트인건가? 머릿속이 복잡해지면서 헷갈리기 시작했다. 그래서 검색을 해봤는데 어떤 글은 컨트롤러부터, 어떤 글은 서비스 부터... 등등 다 다른 것이다 뭐지??? 우선 결론부터 통합 환경 테스트 스프링 기준으로 통합 환경 테스트는 스프링 컨테이너가 돌아가는 환경이다. 통합 환경 테스트는 실제 DB를 건들인다. 실제 어플리케이션 환경에서 동작하는 방식을 테스트하려는 목적 단위 테스트 단위 테스트는 스프링 컨테이너가 돌아가지 않..
구현 기능 중에 컬럼 위치 변경 기능이 있어서 어떻게 구현할까? 고민을 많이 했다. 우선 첫번째로 생각난 것은 Entity 내부에 Position 값을 주고 정렬 그 값을 기준으로 정렬하는 것이다. Position을 어떻게 주고, 변경할 때는 Position을 어떻게 변경해야할까? Entity 내부에 List For문으로 하나하나 돌면서 업데이트 쿼리 보내기? 효율이 진짜 안좋아질 거 같았다. 그래서 쿼리를 최적화를 하는데 어떻게 할까? 하다가 연산하는 쿼리를 한 번에 날리게끔 생각했다. 우선 포지션 값은 2의 제곱으로 사용하기로 정했는데, 이유는 1,2,3,4,5 와 2,4,8,16,32 를 했을 때, 하나만 순서 변경하는 데에는 문제가 없지만 여러개를 한 꺼번에 옮기라는 요구가 있으면, 1,2,3,4..
오늘 팀 프로젝트를 시작하며 @ColumnDefault 어노테이션을 사용했다 코드 @Entity @Getter @NoArgsConstructor @AllArgsConstructor @Table(name = "boards") public class Board extends TimeStamp { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String title; @Column(nullable = false) private String username; @ColumnDefault("'#ffffff'") private String backgroundColor; @C..
최근 코드 리팩토링을 하면서, 이미지 파일 업로드 기능 추가를 위해 기존 @RequestBody 에서 @ModelAttribute 로 바꿔 사용했다. @PostMapping("/todos") public ResponseEntity createTodoCard( @ModelAttribute @Valid CardPostRequestDto cardPostRequestDto, @AuthenticationPrincipal UserDetailsImpl userDetails) { CardResponseDto responseDto = cardService.createTodoCard(cardPostRequestDto, userDetails.getUser()); return ResponseEntity.status(201)...