🔙 Backend

    Docker :: Buildx 와 Github Actions 로 Multi-Platform Image 만들기

    Docker :: Buildx 와 Github Actions 로 Multi-Platform Image 만들기

    에러 로그 The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) 문제 상황 지금 제 프로젝트는 로컬에서 feature 브랜치를 파서 개발한 후 develop 브랜치로 merge 요청을 보내면 Github actions 이 실행되는 구조입니다. Github actions 에서는 Docker 이미지를 빌드 후 hub 에 push 하고, 서버에 ssh 로 접속해 방금 push 한 이미지를 pull 받은 후 docker compose up 을 실행합니다. 이때 정상적으로 빌드해서 push 한 이미지가 서버에서는 run 되지 않는 이슈가 있었습니다. 현재 프로젝트의 개발서버는 제 자..

    RDS :: Too many connections 오류 해결 (mariaDB)

    RDS :: Too many connections 오류 해결 (mariaDB)

    문제상황 스프링 서버를 도커 컨테이너로 실행했는데 갑자기 Too many connections 에러 발생..! DB 는 AWS RDS 로 mariadb (t3.micro) 를 사용 중이다. 세팅 확인 현재 연결되어 있는 thread 수와 지정된 wait timeout 값, max connections 값을 확인해보자. 연결된 thread 수 확인 SHOW STATUS LIKE ‘threads_connected’; 현재 wait timeout 값 확인 SHOW VARIABLES LIKE ‘wait_timeout’; 현재 max connections 값 확인 SHOW VARIABLES LIKE ‘max_connections’; 확인해보니 max connections 값이 30 으로 되어 있는데, 연결된 th..

    RDS :: Incorrect string value: '\xEC\x9D\xB4\xEC\xA3\xBC...' for column 오류 해결 (mariaDB)

    RDS :: Incorrect string value: '\xEC\x9D\xB4\xEC\xA3\xBC...' for column 오류 해결 (mariaDB)

    문제상황 카카오 로그인 이후 받아온 nickname 값을 DB 에 저장하려고 했는데 Incorrect string value 에러가 떴다. 검색해보니 클라이언트에서 보낸 데이터를 DB 에 넣으려 할 때, 그 데이터가 한글이면 오류인 것으로 문제를 파악할 수 있었다 ! DB 의 character set 을 utf-8 로 설정하면 바로 해결되는 문제. 해결방안 RDS 의 파라미터 그룹을 수정해준다. 만약 RDS에 default 파라미터 그룹이 적용되어 있다면 파라미터 그룹을 새로 만들면 된다. 파라미터 그룹에서 character 를 검색해보자. 검색해서 나오는 character_set 들의 값을 전부 utf8mb4 로 바꿔주자. utf8 로만 변경해도 되지만, 이모지와 같은 값들을 DB 에 넣고 싶다면 mb..

    Spring Boot :: @FeignClient 로 외부 REST API 간편 호출

    Spring Boot :: @FeignClient 로 외부 REST API 간편 호출

    들어가면서 카카오 및 애플 로그인을 구현하면서 외부 API 서버에 접근해 데이터를 받아와야 하는 일이 많아졌고, API 주소를 설정파일에 저장한 후 직접 HttpURLConnection 을 생성해서 연결하는 코드가 중복되게 되었다. 또 직접 HttpURLConnection 을 연결해 외부 API 에서 데이터를 받아오면 받아온 JSON 을 직접 파싱해야 하는 불편함도 존재했다. 정리하자면, 외부 API 를 간편하게 호출하고 싶어서 호출 결과를 직접 파싱하는 과정이 번거로워서 FeignClient 를 사용하게 되었다. 아래 설명에서는 많이 예시를 드는 Github API 를 이용해서 코드를 작성해보았다. FeinClient Feign 은 Netflix 에서 개발한 REST Client 이다. 기존에 Rest..

    EC2 :: Ubuntu Swap 메모리 설정

    EC2 :: Ubuntu Swap 메모리 설정

    EC2 프리티어 서버로 스프링을 띄우고, CI/CD 를 세팅하고 하다보면 메모리가 부족한 경우가 종종 있다. 메모리를 늘리려면 과금을 해야하고.. 간단한 실습이나 개발용 환경 세팅이라면 사양을 올리기보다 Swap 메모리를 이용해 이를 해결할 수 있다. Swap 파일 또는 파티션 확인 sudo free -m Swap 영역이 0 이니 설정을 해주자 Swap 파일 생성 sudo fallocate -l 2G /swapfile 용량이 2G 인 swapfile 이란 이름의 파일을 생성했다. 위 파일을 스왑파일로 설정하자. sudo mkswap /swapfile 600의 permission 을 권장한다고 하니 바꿔주자. sudo chmod 600 /swapfile Swap 활성화 sudo swapon /swapfil..

    JUnit :: ParameterizedTest 로 경계값 테스트하기

    JUnit :: ParameterizedTest 로 경계값 테스트하기

    경계값에서 장애가 많이 일어난다 테스트할 때는 input 값의 경계값에 대해서 항상 테스트를 진행해야 한다 그러기 위해 ParameterizedTest 를 이용하면 여러 데이터 소스를 사용할 수 있다. build.gradle 수정 junit-jupiter-params 추가 testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' 자세한 내용은 아래 링크 참조 https://www.petrikainulainen.net/programming/testing/junit-5-tutorial-writing-parameterized-tests/ 실습 비밀번호 입력 값 검증 테스트 요구사항 비밀번호는 최소 8자 이상 12자 이하여야 한다. 비밀번호가 8자 미..

    JPA :: 벌크성 수정 쿼리

    JPA :: 벌크성 수정 쿼리

    벌크 연산 여러 건의 데이터를 한 번에 수정하거나 삭제 조건에 맞는 객체를 다 가지고 와서 수정할 필요 없이 DB 쿼리로 해결하는 것. JPA Bulk 예제 코드 : 파라미터로 받은 나이보다 많은 회원들의 나이를 +1 시킨다. public int bulkAgePlus(int age) { return em.createQuery( "update Member m set m.age = m.age + 1" + " where m.age >= :age") .setParameter("age", age) .executeUpdate(); } 테스트 코드 @Test public void bulkUpdate() { //given memberJpaRepository.save(new Member("member1", 10)); m..

    JPA :: 페이징과 정렬

    JPA :: 페이징과 정렬

    기존 JPA 페이징과 정렬 public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } public long totalCount(int age) { return em.createQuery("select count(m) from Member m where m.age = :age", Long.class) .setParameter("age", a..