Volume 활용 코드를 저장하자마자 컨테이너에 바로 적용할 수 있는 방법이 있다. docker run -it -p 4000:4000 --env-file .env -v $(pwd)/app:/usr/src/my-app/app express-dev 위와 같이 사용하면되는데 하나씩 살펴보자. -it: 이 옵션은 컨테이너를 대화형 모드로 실행하며 터미널 입력을 가능하게 한다. i는 표준 입력(STDIN)을 열고, t는 가상 터미널을 할당합니다. -p 4000:4000: 이 옵션은 호스트의 포트와 컨테이너의 포트를 매핑한다. 여기서는 호스트의 4000번 포트를 컨테이너의 4000번 포트에 연결한다. 포트매핑에 대해 저번 글에서 다뤘다. 2023.12.10 - [CI-CD/Docker] - Port mapping ..
우선 컨테이너는 운영체제를 직접 설치하는 것이 아닌 흉내내는 것이다. DockerFile을 생성한다.From - Base Image, 운영체제 작성 Docker File은 설정파일이다.어떤 프로그램이, 어떠한 운영체제로 돌아가고, 어떻게 컨테이너가 켜졌을 때 안에 있는 프로그램을 어떻게 실행할 것인지 등 설정에 대한 파일이다. Docker Cli를 사용하여 Docker build를한다. "docker build ."build가 되면, Docker Server가 Docker Image를 만든다. 하지만 지금 env파일이 Docker에 올라가고 있다.git에 gitignore가 있듯이, docker에 dockerignore가 있다..dockerignore로 생성하여 .env를 적어주자.이렇게하고 docker..
docker run redis 컨테이너에서 redis가 실행된다. 당연하게도, 로컬 환경에서는 컨테이너에서 실행된 redis에 접속할 수 없다. 연결할 수 없다고 나온다. 만약 이 둘을 연결해서 호스트 머신에서 컨테이너에 접속하고 싶을 때 Port Mapping을 사용할 수 있다. Port Mapping을 하려면 컨테이너를 생성할 때 설정을 해줘야 한다. 아래와 같이 Port Mapping을 해주자. docker run -it -p 4000:6379 redis 여기서 6379는 컨테이너 내에서 redis가 실행되는 포트이고, 이를 호스트 포트의 4000과 매핑해 준다는 뜻이다. 호스트 환경에서 아래와 같이 실행한다. redis-cli -p 4000 일반 redis-cli는 접속이 안된다. 그 이유는 현재..
AWS ECS 학습과 Docker 명령어 정리 최근 AWS의 ECS(Elastic Container Service) 학습을 시작했습니다. AWS ECS는 컨테이너 기반의 CI/CD 서비스를 제공하기 때문에 Docker와 컨테이너에 대한 이해가 필수적입니다. 이에 따라 Docker 명령어를 정리해보았습니다. Docker 명령어 정리 1. 가장 자주 쓰는 명령어docker run [image name]이 명령어는 사실상 다음 두 명령어를 함께 실행하는 것입니다:docker create [image name] docker start [image name]2. Docker 명령어 상세 설명 2.1. docker create [image name]컨테이너를 생성하는 명령어입니다. 컨테이너는 이미지의 인스턴스로, ..
들어가기 전에 며칠 전 UMC x CMC의 5번째 Ne(o)rdinary Hackathon에 참여했었다. 이때 OAuth 로그인을 담당하신 분이 계셔서 OAuth를 사용은 했지만 내가 직접 구현하지는 않았다. 예전 TravelPlanner 프로젝트를 진행할 때도 다른 팀원분이 Security 설정과 interface를 완벽히 만들어져 있는 상황에서 내 코드를 구현한 것이라 완벽한 이해가 되지 않았다. 그 후, TAVE 12기 백발백준 프로젝트를 진행하며 Github OAuth 로그인과 전반적인 Security를 혼자 담당하게 되었는데, 1주일 동안 고생하며 구현했었다. 아래는 그것을 구현한 이슈이다. https://github.com/Tave100Shot/Server/issues/7 feat: Secur..
QueryDSL의 PagingSpring Data JPA와 QueryDSL을 활용한 페이징에 대해 작성해보려고 한다.Spring Data JPA를 사용하여 JPARepository를 상속받으면서, 동시에 사용자 정의 repository를 동시에 상속을 받아야 한다.Java에서 Class는 다중 상속을 지원하지 않기 때문에, 다중 상속이 가능한 인터페이스를 활용한다.JPARepository와 사용자 정의 Repository를 작성하는 방법은 아래 글에 자세히 적어놓았으니 참고하면 좋을 것 같다.2023.11.24 - [JPA/Spring Data JPA] - [Spring Data Jpa] 6. 사용자 정의 리포지토리 구현 (*중요) 추후 queryDSL 활용 [Spring Data Jpa] 6. 사용자 ..
동적 쿼리동적 쿼리는 애플리케이션에서 매우 흔하게 마주치는 요구 사항 중 하나다.과거 자바 애플리케이션에서 쿼리를 동적으로 수정하는 것은 거의 불가능에 가까웠었다.QueryDSL은 이러한 동적 쿼리를 처리하는 강력한 방법을 제공한다. 이번 글에서는 BooleanBuilder를 활용하여 동적 쿼리를 구성하는 방법을 알아보겠다.방법1. BooleanBuilder를 통한 조건 구성BooleanBuilder란?BooleanBuilder는 QueryDSL에서 제공하는 조건을 동적으로 구성할 수 있는 편리한 클래스이다.쿼리의 조건문(where 절)을 조건에 따라 유연하게 변경할 수 있게 해준다. 이를 통해 코드의 가독성을 유지하면서도 복잡한 조건 로직을 쉽게 구현할 수 있다. 동적 쿼리 구현 예제 다음은 Bool..
프로젝션과 결과 반환 - 기본값의 반환 타입이 여러개이므로 Tuple형태이다.Tuple은 QueryDSL 전용 타입이다.아래의 데이터 반환 타입이 Repository단계에서 해결되는 것이 좋지, 실제 비즈니스 로직인 Service에 해당 데이터 타입이 넘어가는 것은 좋지 않다.List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); 프로젝션과 결과 반환 - DTO 사용 - JPQLList resultList = em.createQuery("select new querydsl.querydsl.dto.MemberDto(m.username, m.age) " ..
설명의 편의를 위해 예시를 둔다.회원의 나이대로 내림차순하는데, 회원 이름으로 올림차순하며, 회원 이름이 없다면 마지막에 출력한다면 쿼리를 어떻게 해야할까?// sample dataem.persist(generateMember(null, 100, null));em.persist(generateMember("member5", 100, null));em.persist(generateMember("member6", 100, null));QueryDSL 쿼리List result = queryFactory .selectFrom(member) .where(member.age.eq(100)) .orderBy(member.age.desc(), member.us..