java/spring

    [Spring] Controller에서 pathvariable로 path(/aaa/bbb) 값 받는 법

    API에서 Pathvariable은 자주 쓰인다. GET: /user/1 -> 여기서 '1'을 pathvariable로 가져올 수 있다. 하지만 만약, path 형태의 값을 pathvariable로 가져오고 싶다면? GET: /user/home/server/list -> 여기서 'home/server/list'를 pathvariable로 가져오고 싶지만, spring에서는 /user/home/server/list 라는 경로에 해당하는 컨트롤러를 찾을 뿐이다. 따라서, 다른 방식을 사용할 필요가 있다. @GetMapping("/user/**") public String getPath(HttpServletRequest request) { return request.getRequestURI().split(re..

    [Spring] AWS Parameter Store를 사용해 변수 불러오기

    [Spring] AWS Parameter Store를 사용해 변수 불러오기

    깃허브와 같은 원격 저장소에 프로젝트를 올리는 경우 코드에 데이터베이스 암호 등 민감한 정보가 담기면 위험하다. 따라서 민감한 정보가 담긴 변수를 암호화하거나, 다른 공간에 저장해놓고 불러오는 방식을 사용할 수 있다. 여기서는 AWS Parameter Store에 변수를 저장하고, 이를 Spring에서 불러오는 방법을 소개하겠다. AWS 설정 Parameter Store에 변수 저장 AWS 관리 콘솔에서 System Manager -> Parameter Store를 클릭한다. 다음과 같은 화면이 나오면, '파라미터 생성' 버튼을 클릭한다. 이제 원하는 파라미터를 생성한다. 파라미터 이름은 /aaa/bbb/password로 3계층으로 생성했다. 이 형식을 꼭 지킬 필요는 없지만, 꼭 다르게 이름을 설정해야..

    [Spring] 개발, 운영 환경 별 profile 설정

    [Spring] 개발, 운영 환경 별 profile 설정

    환경에 따라 다른 설정 개발을 하다보면 테스트를 위한 '개발' 환경과 실제 서비스 배포를 위한 '운영' 환경에 따라 설정해줘야하는 값이 다를 수 있다. 예를 들어, DB 정보나 포트 정보 등이 환경에 따라 다른 경우가 많다. 각 환경에 따라 매번 설정 값을 변경하는 것이 번거롭기 때문에, profile 설정을 통해 간단하게 환경에 맞는 정보를 가져올 수 있다. 현재 스프링 설정 파일 (application.yml)이 다음과 같다고 하자. spring: datasource: url: jdbc:mysql://localohost:3306/test # 테스트 DB # url: jdbc:mysql://localohost:3306/prod # 운영 DB username: admin password: 1234 dri..

    [Spring] FCM 서버 구축하기 (특정 시간대에 알림 보내기)

    [Spring] FCM 서버 구축하기 (특정 시간대에 알림 보내기)

    애플리케이션에 푸시 알림을 특정 시간대에(9시, 13시, 19시) 보내야할 일이 있어서 파이어베이스 자체에서 푸시 알림을 예약해서 사용하고 있었는데, 이게 파이어베이스 자체 문제인지 제대로 알림이 가지 않았다. 그래서 아얘 백엔드에서 FCM 서버를 만들어 특정 시간대에 파이어베이스에 푸시알림을 직접 요청하기로 했다. 본 포스팅에서는 Spring으로 FCM PushNotification(푸시알림) 서버를 구축해보겠다. +) FCM은 사용자 개개인의 토큰을 사용하는 방법과 사용자 그룹인 토픽을 사용하는 방법이 있는데 본 포스팅에서는 토픽을 사용하는 방법을 택했다. Firebase 비공개 키 생성 백엔드에서 푸시 알림을 파이어베이스에 요청하기 위해서는 파이어베이스의 비공개 키 파일이 필요하다. 각자 파이어베이..

    [Spring] Spring Jdbc - batchUpdate()를 사용한 bulk Insert 최적화

    Spring Data JPA의 saveAll()메서드는 인자 값으로 받은 entity들을 저장하는 메서드이다. 실제로 실행해보면 여러 엔티티들에 대한 insert 쿼리가 각각 한 번 씩 차례대로 나가는 것을 볼 수 있다. 엔티티의 수가 적으면 상관없지만, 10,000건, 100,000건 처럼 많아지면 엔티티 1 : insert 1 방식은 부담이 될 수 있다. 인터넷을 검색해보면 hibernate.jdbc.batch_size: 50 처럼 한 번에 여러 건을 insert하는 벌크 연산이 많이 소개되어 있다. 이 방법을 사용해도 좋지만, 여기서는 Spring JPA가 아닌 JDBC를 사용한 보다 빠르고 강력한 연산인 batchUpdate()를 소개하고자 한다. Bulk Insert bulk insert는 여러..

    [Spring] SpringBatch를 사용해 csv 파일 읽어 DB에 저장

    프로젝트 폴더에 있는 csv 파일을 읽어 적절한 엔티티 형태로 바꿔 DB에 저장하는 방법을 알아보자. Spring Batch 배치(Batch)는 일괄처리 란 뜻을 가지고 있다. 만약 대용량의 파일을 DB에 저장하는 기능이 필요하다고 가정해보자. 이렇게 큰 데이터를 읽고, 가공하고, 저장한다면 해당 서버는 순식간에 CPU, I/O 등의 자원을 다써버릴 것이다. 그리고 이 집계 기능은 하루에 1번 수행된다. 이를 위해 API를 구성하는 것은 너무 낭비가 아닐까? 바로 이런 단발성으로 대용량의 데이터를 처리하는 애플리케이션을 배치 애플리케이션이라고 한다. 스프링에서는 Spring Batch를 통해 배치 애플리케이션을 사용할 수 있다. 이해를 돕기 위해 대용량의 csv 파일(food.csv)을 읽어 DB에 저장..

    [Spring] AWS S3, csv 파일 읽어서 DB에 저장

    프로젝트 중 AWS S3에서 특정 버킷의 파일을 읽어 DB에 저장해야 하는 상황이 생겨 기록을 한다. build.gradle - 의존성 추가 dependencies { ... implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' ... } spring boot와 aws를 연동시키기 위해 build.gradle에 spring-cloud-starter-aws를 추가한다. application.yml - aws 자격 정보 입력 cloud: aws: credentials: instance-profile: false access-key: {IAM MY_ACCESS_KEY 입력} secret-key: {IAM MY_SECE..

    [Spring] AWS S3에서 Spring Boot로 파일 다운로드

    [Spring] AWS S3에서 Spring Boot로 파일 다운로드

    프로젝트 중 AWS S3에서 특정 버킷의 파일을 다운로드 받아야 하는 상황이 생겨 기록을 한다. build.gradle - 의존성 추가 dependencies { ... implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' ... } spring boot와 aws를 연동시키기 위해 build.gradle에 spring-cloud-starter-aws를 추가한다. application.yml - aws 자격 정보 입력 cloud: aws: credentials: instance-profile: false access-key: {IAM MY_ACCESS_KEY 입력} secret-key: {IAM MY_SECERT_..