- select
- ORM
- hibernate
- PYTHON
- Django
- 데이터베이스
- java
- nginx
- 자바
- Docker
- 스프링
- springboot
- 1차원 배열
- AWS
- SSL
- spring boot
- jpa
- 문자열
- @transactional
- string
- spring security 6
- mysql
- spring
- 스프링부트
- static
- sql
- DI
- join
- 프로그래머스
- spring mvc
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
목록분류 전체보기 (191)
개발하는 자몽

기존에는 EC2 우분투 환경에서 운영되는 프로그램들의 로그를 AWS CloudWatch에 전송할 수 있도록, 우분투에서 CloudWatch Agent 패키지를 설치하고 관련 설정을 진행했다. 이번에는 EC2(마찬가지로 우분투 환경)에서 Docker 컨테이너로 띄운 프로그램의 로그를 AWS CloudWatch에 전송할 수 있도록 설정을 해보자. 관련 공식 자료는 여기를 참고하자. (딱히 좋은 글인 것 같지는 않다...) CredentialsEC2 상에서 운영되는 Docker 컨테이너의 로그를 AWS CloudWatch에 전송하기 위해서는 `awslogs` 로깅 드라이버를 사용해야 한다. 이를 위해 자격 증명(credentials)이 필요하며, 해당 자격 증명을 Docker 데몬에 전달해야 한다. 자격 증..

⚠️이 포스트는 지식 공유보다는 본인이 나중에 다시 보기 위해 작성하는 기록용입니다... build.gradledependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-security' ...} application.ymlspring: security.oauth2: client.registration: kakao: client-name: Kakao client-id: ${CLIENT_ID} client-secret: ${..
일반적으로 Spring 애플리케이션에서 application.yml에 정의된 값을 static 변수에서 사용할 수 없다. 따라서 Spring에서 제공하는 `@Value` 애노테이션으로 설정 파일에 정의된 값을 static 변수에 주입하면 에러가 발생한다. Java의 static 변수는 아래 시점에 메모리에 저장된다. 스프링 컨테이너(Application Context)가 로드되기 전 == 객체 생성 이전 == 의존성 주입을 받기 전 하지만 `@Value`는 의존 관계 주입 시점(인스턴스 수준)에서 동작한다. 이로 인해 의존성 주입을 받기 전에 메모리에 저장되는 static 변수에는 값을 주입할 수 없다. 이는 더 나아가서 클래스 레벨에도 동일하게 적용할 수 있다. `@Component` 애노테이션이..
AWS Lambda 사용법을 조사하다가 Amazon API Gateway가 같이 언급되는 글이 많길래 왜 그런가 찾아봤다. 결론은 Lambda가 특별히 API Gateway가 필요해서 같이 붙어 다니는 건 아니었다. Lambda는 특성상 무거운 프로그램의 서버보다는, 한 가지 목적에 집중하는 가벼운 프로그램의 서버로 적합하다. 각 기능(인증, 스케쥴링, 모니터링 등)을 여러 개의 Lambda로 분리해서 API Gateway로 연결하는 편이 좋다. 다음은 API Gateway를 사용했을 때 얻을 수 있는 이점이다. Reusability Lambda 유무와 관계없이 API Gateway를 사용하면 새 프로젝트 시작할 때마다 인증 기능을 구현할 필요도 없다. 인증 기능이 배포된 서버를 API Gatewa..
상황1:N 관계가 얽혀있는 엔티티를 대상으로 Spring Data JPA를 이용해서 Pagination 조회를 하니 말로만 듣던 N+1 상황이 발생했다. 처음에는 일반적인 해결 방법인 Fetch Join을 사용하려고 했다. 더불어 중복을 방지하기 위해 `DISTINCT` 추가하려고 했다. 그러나 1:N 관계의 컬렉션을 Fetch Join 하면서 동시에 Pagination을 사용하는 것은 OutOfMemoryError가 발생할 수 있고, 이로 인해 `DISTINCT`를 적용할 수 없다고 한다. 그래서 찾은 다른 방법 중 가장 빠르고 쉬운 방법은 Batch Size를 설정하는 것이었다. 하이버네이트 Batch Size 하이버네이트에서 제공하는 `@BatchSize` 애노테이션이나 `batch_size`..
Gradle로 테스트를 빌드하다가 제목과 같은 에러를 만났다. 사실 처음에는 그냥 빌드하다가 위와 같은 정확한 에러명이 나오지 않아서 나중에 빌드할 때 아래 명령어를 사용했다. 그냥 빌드했을 때 실패했다고만 나오면 해당 옵션으로 시도하는 것을 추천한다👍./gradlew test -i # 윈도우 gitbash에서 실행 Note `-i / --info` 옵션은 로그 레벨을 INFO로 설정하는 것이다. 에러 내용을 봤을 때 yml/properties 파일에 작성한 프로퍼티 설정을 가져오면서 뭔가 문제가 있는 것 같았다. 그리고 역시나 `@Value`로 yml에 적힌 값을 가져올 때 오타가 있었다. 이 부분을 수정하고 다시 빌드하니 해당 에러는 더 이상 보이지 않았다! (관련 없는 다른 에러가 반겨주었..
지난 포스팅에 이어서 작성합니다.2024.10.02 - [Java] - Java/Spring 테스트 - 1 의존성의존성컴퓨터 공학에서 말하는 의존성(Dependency)은 결합(Coupling)과 같은 의미로, 다른 객체의 함수를 사용하는 상태를 말함 ⇒ A는 B를 사용하기만 해도 의존한다고 할 수 있음의존성을 약하게 만드는 기술 중 하나가 의존성 주입필요한 값을 `new`해서 직접 인스턴스화하는 것이 아닌 외부에서 넣어주는 것`new`를 이용하여 인스턴스화 하는 것은 하드 코딩의존성 주입은 의존성을 약화시키는 것, 의존성을 완전히 없애는 방식이 아님의존성 제거 == 객체 간의 협력 부정 / 시스템 간의 협력 부정대부분의 디자인 패턴이나 설계는 어떻게 하면 의존성을 약화시킬 수 있는지 고민한 결과..
에러 원인정말... 바보같은... 실수였다... 오류가 났던 테스트 코드는 아래와 같다. ... @PersistenceContext EntityManager em; @Test void test() { UserEntity userEntity = UserEntity.builder() .nickname("test") .email("test@example.com") .build(); userEntity = userRepository.save(userEntity); userService.sumTotalAmount(userEntity, 10_000L); ..
이 글은 아래 인프런 강의를 듣고 기록을 남기고자 작성하였습니다. Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트 강의 | 김우근 - 인프런김우근 | Spring에 테스트를 넣는 방법을 알려드립니다! 더 나아가 자연스러운 테스트를 할 수 있게 스프링 설계를 변경하는 방법을 배웁니다., 프로젝트 설계를 발전시키는 테스트의 본질을 짚www.inflearn.com 🔖목차🔖TDD테스트란테스트TDD장단점개발자의 고민테스트 코드의 필요성좋은 아키텍처란필요성테스트 3분류개념 TDD회귀 버그(Regression Bug) → 테스트 자동화테스트 추가소프트웨어의 내적 품질 향상 O, 사용자가 체감할 수 있는 외적 품질 향상 X가시적 성과 지표 → 커버리지(Coverage) 비결정적인 테스트테스트를..
`Dockerfile` 안에서 스프링 부트 프로젝트를 `gradlew`로 빌드하려고 찾아보니 `build` 말고 `bootJar`를 추천했다. 이유가 궁금해져서 이렇게 글을 정리하게 되었다. build`build`는 Base Plugin이 제공하는 생명주기 작업으로, 대상 소스의 생명주기 확인이나 어셈블 작업을 수행한다. 여기에는 테스트 실행이나 프로덕션 아티팩트 생성 등이 포함되어 있다. bootJar`bootJar`는 대상 소스를 실행가능한 `jar` 파일로 빌드하는 것으로, 빌드 속도가 `build` 작업에 비해 빠르고 당연히 생성되는 것도 적다. 이렇게 빌드된 파일은 `build/libs/*.jar`에 위치하게 된다. 이렇게 생성된 파일을 대상으로 `jar -xf {대상 jar 파일}` 명령어를..