Back-End 56

geojson을 스프링을 통해서 MySQL에 넣어보자

https://github.com/vuski/admdongkor GitHub - vuski/admdongkor: 대한민국 행정동 경계 파일대한민국 행정동 경계 파일. Contribute to vuski/admdongkor development by creating an account on GitHub.github.com우리나라 행정동 경계는 이미 다른 분이 만드셔서 이를 활용하였다. json 파일을 열어서 분석해보자 제일 위의 사직동을 예시로 보겠다.{ "type": "FeatureCollection", "name": "20250401", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84..

Back-End/work 2025.10.01

Real My SQL 8.0 [공간 데이터]

최근 당근의 지역기반 데이터 조회에 대한 궁금증이 생겨서 어떻게 공간데이터를 처리하는 지 알아보기위해먼저 공간 데이터에 대한 학습이 필요하여 정리하게 되었다. 공간 데이터 타입mysql 서버는 OpenGIS에서 제시하는 표준을 준수OpenGIS에서 제공하는 WKT(Well Known Text), WKB(Well Known Binary)를 이용해공간 데이터를 관리할 수 있게 지원 OpenGIS는 지리 공간 정보 기술의 개방형 표준이다. Open Geospatial Consortium(OGC)에서 개발한 지리 공간 데이터 및 서비스에 대한 일련의 기술 사양을 의미한다. WKT : 공간데이터를 글자로 적음, EX) POINT(1,1) 데이터 타입 GEOMETRY는 슈퍼 타입으로 셋 중 아무거나 다 받을 수..

Back-End/DB 2025.09.25

Real MySQL 8.0 [실행계획 : Extra 칼럼]

내용이 많아 따로 글을 나눠서 작성한다. Extra 칼럼쿼리 실행 계획에서 성능에 관련된 중요한 내용이 자주 표시됨 const row not foundconst 접근 방법으로 테이블을 읽었지만 실제로 해당 테이블에 레코드가 1개도 없다면 표시Deleting all rows 테이블의 모든 레코드를 삭제하는 기능을 제공하는 경우 (Where 없이 모두 삭제)8.0부터 삭제되고, where 없이 삭제를 권장하지 않음, Truncate Table 사용distinct중복제거, 중복된 값들은 읽지 않고 무시함 FirstMach(table)IN(subquery) 형태의 세미 조인 을 EXISTS(subquery) 형태로 튜닝한 것과 비슷하게 실행되며, 서브 쿼리를 조인으로 처리하며, 일치하는 레코드 1건만 찾으면 더..

Back-End/DB 2025.09.03

Real MySQL 8.0 [실행계획]

대부분 DBMS는 많은 데이터를 안전하게 저장 및 관리 사용자가 원하는 데이터 빠르게 조회가 주 목적 이를 달성하기 위해 옵티마이저가 사용자의 쿼리를 최적으로 처리될 수 있게 하는 쿼리의 실행 계획을 수립할 수 있어야함 EXPLAIN 명령으로 옵티마이저가 수립한 실행 계획 확인 MYSQL 5.7버전까지 테이블과 인덱스에 대한 개괄적인 정보를 가지고 실행계획을 수립함 8.0부터 히스토그램 도입 히스토그램 : 인덱스되지 않은 칼럼들, 인덱스된 칼럼들의 데이터 분포도 통계 정보는 단순히 인덱스된 칼럼의 유니크한 값의 개수 정도만 가져 옵티마이저가 최적의 실행계획을 수립하기에는 많이 부족 실제 인덱스의 일부 페이지를 랜덤으로 가져와 참조하는 방식 사용 8.0부터 칼럼 데이터 분포도를 참조 가능한 히스토그램 정보..

Back-End/DB 2025.09.01

락에 대하여

흔히 DB에서 동시성 제어를 위해 사용하는 락에 대해서 다시 공부할 필요가 있어정리하고 이해한다. 락은 말 그대로 잠금이다. 동시성 제어를 위해 사용되며 3가지 종류가 있다.비관적 락(Pessimistic Lock)낙관적 락(Optimistic Lock)분산 락(Distrubuted Lock) 비관적 락DB나 멀티 스레드 환경에서 여러 사용자가 동시에 동일 레코드에 접근할 때 충돌을 방지하기 위해미리 락을 거는 방식으로, 사실상 의미그대로 잠금을 거는 것이다. 동시 접근이 많을 경우, 충돌이 많이 일어날 경우 사용한다. 비관적 락 종류Shared Lock(공유 락, S-Lock)데이터 읽기 시 사용 하는 락여러 트랜잭션이 동시 공유락 가능 (동시 읽기 허용)배타 락이 걸리면 동시 접근 불가Exclusi..

Back-End/DB 2025.08.20

Docker 이미지 생성 및 컴포즈

Dockerfile직접 이미지를 생성할 수 있게 해주는 파일 명령어FROM [이미지명]:[태그명]COPY [호스트 컴퓨터에 있는 복사할 파일의 경로] [컨테이너 파일 위치 경로]ENTRYPOINT [명령문1, 명령문2, 명령문..]RUN [명령문]WORKDIR [작업 디렉토리로 사용할 절대 경로]EXPOSE [포트번호] FROM : 베이스 이미지 생성한다. 베이스 이미지 : 초기 기본 세팅, 쉽게 말해서 기본 프로그램 느낌이다.JAVA에 한해서는 JDK가 베이스이미지가 되겠다. COPY : 호스트 파일에 있는 파일을 컨테이너에 복사 ENTRYPOINT : 컨테이너 생성시 최초 실행때 수행하는 명령어 RUN : 이미지 생성과정에서 명령어를 실행시켜야 할 때 사용ex) npm install, apt upda..

Back-End 2025.07.09

프로젝트 중 잘못된 테스트 바로잡기

✔️ 문제테스트를 하는데 자꾸 이상하게 예측값보다 -1 인 값이 나와서보니 테스트 코드를 잘 못 짜서 그런 것이였다. @Transactional과 @BeforeEach를 제대로 사용하지 않았기 때문이였다. 문제의 코드 @Slf4j@SpringBootTestclass FocusTimeJdbcRepositoryTest { @Autowired FocusTimeJdbcRepository repository; @Autowired FocusTimeJpaRepository jpaRepository; @Autowired MemberRepository memberRepository; @Autowired TransactionTemplate transactionTemplate;..

Back-End/Spring 2025.07.08

Docker 기본 개념

docker는 컨테이너를 사용하여 각 프로그램을 독립된 환경에서 실행 및 관리하는 툴docker는 이식성이 매우 좋다. 컨테이너 : 미니 컴퓨터 개념 (독립된 환경)이미지 : 게임 칩 , 프로그램 실행시 필요한 설치과정, 설정, 버전 정보 등 모든 것을 포함 docker의 이미지는 docker hub에서 다운받는 것이다. 포트호스트 포트와 컨테이너 포트가 구분되는데호스트 컴퓨터 안에 컨테이너가 있기에 외부에서 컨테이너로 접근 불가 따라서 호스트에서 포트포워딩으로 컨테이너를 매핑해준다. 볼륨볼륨은 설정 파일등을 영속화한다. 절대경로로 지정하며, 웬만하면 빈 폴더 혹은 폴더를 삭제하고 지정 호스트와 컨테이너 볼륨이 서로 동기화하기에한쪽이 없으면 한쪽에서 가져온다. 볼륨으로 인한 설정 정보 유지때문에 비밀..

Back-End 2025.07.02

정렬 방식 실렬 방식 실습

3가지 정렬 방식인덱스 사용조인의 드라이빙 테이블만 정렬임시 테이블 사용 후 정렬 3가지가 실제로 어떻게 적용되는지 궁금해서 직접 구현해봤다. CREATE TABLE tb_test1 ( col1 int NOT NULL, col2 int DEFAULT NULL, PRIMARY KEY (col1), INDEX ix_col1_col2 (col1,col2), INDEX ix_col2 (col2)) ENGINE=InnoDB CREATE TABLE tb_test2 ( col1 int DEFAULT NULL, col2 int DEFAULT NULL, INDEX ix_col1_col2 (col1,col2)) ENGINE=InnoDB303p 의 퀴리문을보고 테이블을 만들었다. 해당 쿼리로 테스트 한다. ..

Back-End/DB 2025.07.01

테스트에서 영속화

스프링에서 테스트 코드 작성 중 엔티티의 영속화를 유지할 필요가 있다면@Transactional이 아닌TransactionTemplate를 사용해볼 수 있다.테스트 코드에서 @Transactional은 테스트 시작시 열리고 테스트가 끝나면 롤백된다. @AfterEach@Transactionalvoid delete() { Member member = memberRepository.findBySocialId(SocialType.KAKAO, "2gjdkl12333").get(); log.info("해당 id 삭제 ={}", member.getId()); memberRepository.deleteMember(member); }위 코드가 실행되면 member는 비영속화상태이기에 실패한다.Remov..

Back-End/Spring 2025.06.30