목록프로그래밍 (409)
쌓고 쌓다
우리가 DB 커넥션을 획득할때 어떤 과정을 거칠까?애플리케이션은 DB 드라이버를 통해 커넥션을 조회.DB 드라이버는 DB와 TCP/IP 커넥션 연결을하며 이때 3-way-handshake 같은 동작들이 발생.DB 드라이버는 TCP/IP 커넥션 연결되면 ID/PW 같은 부가 정보들을 DB에 전달.DB에서 ID/PW를 통해 내부 인증을 거치며 내부에 DB 세션을 생성한다.DB는 DB 드라이버에게 커넥션 생성 완료를 응답.DB 드라이버는 커넥션 객체를 생성해서 애플리케이션(클라이언트)에 반환. DB가 필요할때 마다 커넥션을 맺고 끊음의 반복은 시간이 많이 드는 일이다.그래서 커넥션을 미리 생성해서 두고두고 사용하는 방법이 커넥션 풀이다.커넥션 풀에 커넥션들은 DB와 TCP/IP 커넥션이 맺어진 상태로 보관되어..
MySQL의 데이터를 백업해보고 그 데이터를 Docker MySQL에 가져와보자. 그리고Docker 컨테이너를 통해 올린 DB 데이터를 Host에서 관리해보자. 먼저 Docker MySQL 볼륨을 마운트해보자.즉, Docker 컨테이너에 올려진 DB의 데이터가 Host에서 관리되길 원하는것이다.docker-compose.ymlversion: '3'services: db: image: mysql:8.0.33 container_name: spot-db restart: always ports: - "3306:3306" command: - "--character-set-server=utf8mb4" - "--collation-server=utf8mb4_uni..
스프링부트 서버는 Container로 띄우고 DB는 로컬을 사용하길 원하는 상황이다. DB는 localhost만 접속이 가능한 상황인데 Docker 컨테이너에서 localhost는 로컬이 아닌 컨테이너 자신의 ip이다. 쉽게말해 컨테이너에서 localhost는 컨테이너이기 때문에 내 로컬에 접근하지 않는것이다. 그래서 Dokcer 컨테이너에서 local의 DB에 접근을 못하는 상황이다 application.properties를 다음과 같이 수정한다. spring.datasource.url=jdbc:mysql://host.docker.internal:3306/spot -> 원래는 mysql://localhost:3306 이지만 host.docker.internal로 컨테이너 내부에서 호스트 머신의 네트워..
C++로 알고리즘을 풀고 공부했는데... 우아한 테크 캠프 모집을 봤는데 코딩 테스트 언어로 Java만 지원 받는다는 ... 충격적인... 그래서 백엔드를 희망하기도해서 이제 알고리즘 공부를 Java로 시작하기로 다짐했다.. 당장 코딩 테스트인데 자바로 기본적인 자료구조 사용하는 법을 정리하고자 한다.. 자료구조 사용을 위해 다음을 import하면 된다. import java.util.*; Stack Stack s = new Stack(); // 생성 s.push(1); // 삽입 s.pop(); // 삭제 s.peek(); // 조회 s.empty(); // 크기 조회 Queue Queue q = new LinkedList(); // 생성 q.add(1); // 삽입 q.remove(); // 삭제 q..
아래의 Dockerfile을 만들어 주자. FROM openjdk:17 ARG JAR_FILE=build/libs/spotServer-0.0.1-SNAPSHOT.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] COPY : ${JAR_FILE}를 도커 이미지의 ./app.jar 경로에 복사한다. ENTRYPOINT : Docker 컨테이너가 시작될때 실행되는 명령을 지정한다. 그리고 로컬에서 빌드한다. 테스트 코드는 빌드에서 제외하기 위해 -x test를 추가해주었다. ./gradlew build -x test 빌드한 파일은 JAR_FILE 경로에 존재하게 된다. 그리고 다음 명령어를 실행하자. docker build --platf..
원하는기능은 다음과 같았다. 게시글과 댓글은 일대다 관계이고 작성한 댓글의 게시글을 중복없이 최근에 작성한 댓글의 게시글이 먼저 오도록 정렬하는 QueryDSL을 작성하길 원했다. 처음에 QueryDSL을 사용하다가 다음과 같은 코드를 작성했었다. List posters = jpaQueryFactory .select(new QPosterResponse( poster.id, poster.writer.id, poster.writer.name, poster.title, poster.content, poster.regDate, ExpressionUtils.as( JPAExpressions .select(posterLike.count()) .from(posterLike) .where(posterLike.poste..
잘 돌아가던 최신순 조회 테스트 코드가... 갑자기 실패하기 시작한다?? 반복문을 통해 게시글을 순서대로 DB에 잘 저장도 하고 있고 작성일을 출력해봐도 먼저 들어간 게시글이 더 빠른 시간으로 출력도 된다... 뭐가 문제일까? Service단의 반환으로 받은 정렬된 게시글의 정보도 한번 출력해보자. PageResponse pageResponse = posterService.getLocationPosters(newLocation.getId(), conditionRequest); PageInfo pageInfo = pageResponse.getPageInfo(); List posters = pageResponse.getResults(); //then ... for (int i = 0; i < posters...
이상하게 댓글과 같이 생성된 엔티티의 생성일이 한국 시간이 아닌 다른 시차로 적용되는 상황이 발생했다. 댓글 엔티티를 예로 들겠다. @Entity @Data public class Comment { @CreationTimestamp private LocalDateTime regDate; } 로컬에서는 @CreationTimesetamp의 시각이 현재 시각으로 잘 나왔지만 외부 서버인 AWS EC2에서 서버를 돌렸을때는 다른 시각으로 나왔다. MySQL의 타임 설정을 한국으로 맞춰 SELECT now()의 결과로 한국 시간이 잘 나왔고 우분투 환경 또한 설정하여 잘 나왔다. 그럼 @CreationTimestamp의 설명을 잘 읽어보자... 기본 타임 스탬프는 메모리를 통해 생성된다고 나와있다. source..