스터디/네트워크

파일 해시와 체크섬을 이용하여 파일 무결성 확인하기

파일 해시와 체크섬 팀에서 사용하고 있으니 조금 더 이해가 필요하다고 판단했다. 일단 필요한 지식에 대해서 간단하게 컨셉정도만 이해하도록 하자. 해시 해시는 간단하게 해시 알고리즘(Hash Algorithm)을 통해 계산해서 생성된 값을 의미한다. 해시 함수에 원본 값이 다름에도 해시된 결과 값이 충돌 될 수도 있기 때문에 해싱하는데에 유의를 해야한다. 대표적으로 MD5, SHA 계열의 함수가 있다. 체크섬 체크섬은 오류 검출을 위한 기법으로 통신으로 주고받는 데이터의 신뢰성을 보장하기 위한 방법이다. TCP 세그먼트에는 IP헤더, 체크섬, 송수신지 주소등의 정보가 있는데 TCP 세그먼트의 값들중 체크섬을 제외한 모두 더한다음 그 결과과 세그먼트의 체크섬 값과 일치하는지 확인한는 방식을 말한다. 적용 사..

2021.09.22 게시됨

스터디/인프라

LocalStack으로 AWS 로컬 환경 구축하기

목적 Docker와 LocalStack, AWS CLI을 이용해서 AWS SQS를 구축해보자. 환경 Docker Engine : 19.03.8 compose : 1.25.4 Mac os docker-compose.yml version: "3" services: localstack: container_name: localstack image: localstack/localstack:0.12.11 ports: - "4566-4576:4566-4576" environment: - SERVICES=sqs - DEFAULT_REGION=${DEFAULT_REGION- } - DEBUG=0 - DOCKER_HOST=unix:///var/run/docker.sock - "/var/run/docker.sock:/var..

2021.05.30 게시됨

스터디/Kotlin

[오늘의 에러] Kotlin Internal Test 에러 해결

!! 이상하다 gradle 프로젝트를 reload 하면 다시 돌리고하면 아래와 같이 하지 않아도 문제 해결이 된다. 아무래도 인텔리제이가 프로젝트를 로드 하면서 인덱싱을 할 때 엉뚱한 곳을 바라보면서 발생하는 문제인 것 같다. 흠.. 그냥 맘편하게 internal 키워드를 제거하고 테스트를 작성하는게 나을것 같다.. 물론 이것 또한 추측이다.. 문제 상황 인텔리제이에서 코틀린에서 테스트를 만들면 기본적으로 internal 메서드로 된 테스트를 만들어 주는데 이 테스트를 돌리면 자꾸 에러가 발생한다. Internal Error occurred. org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to dis..

2021.02.10 게시됨

스터디/인프라

[오늘의 에러] localstack과 mesosphere/aws-cli Connection aborted

프로젝트를 하면서 로컬 환경을 개발 환경과 일치시키기 위해서 도커를 많이 쓰고있다. 근데 도커를 사용하니까 이게 내 로컬 환경 설정이 문제인지 도커 환경 설정(도커엔진)의 문제인지, 아니면 도커 이미지 혹은 컨테이너의 문제인지 알 길이 없더라. 오늘은 장장 4일에 걸쳐 해결한 어이없는 문제를 기록하고자 한다. localstack 먼저 문제의 상황에서 localstack을 사용하고 있었는데 나처럼 localstack을 처음 접한 사람을 위해 간단하게 얘기하면 aws의 컴포넌트들(sns, sqs, s3)등을 가상의 환경으로 띄워주는 녀석이다. 로컬 환경에서는 개발 환경 처럼 aws에 항상 sns, sqs 를 구동시켜놓기 힘든데 이렇게 localstack을 사용하면 그러한 문제를 쉽게 풀어갈 수 있다. mes..

2021.01.29 게시됨

스터디/JPA

Spring Data Jpa Bulk Insert 하기

나는 내가 모르는 기술을 만나면 반갑기도 하지만 엄청 겁을 먹어버리는데 처음 맡은 업무에서 파트장님이 '이 부분을 JPA 를 이용해서 bulk insert 하도록 변경해주시면 됩니다!' 하셨을 때 살짝 식은땀이 났다. '헉 나 할줄 모르는데..' 다행히 업무를 주시기 전에 어떻게 풀어나가야 하는지 팀 기술 세미나를 통해서 가이드를 해주셨고 무사히 마칠 수 있었다! application.yml 설정 application.yml 에 필요한 설정은 다음과 같다. spring: jpa: properties: hibernate: jdbc.batch_size: 100 order_inserts: true order_updates: true datasource: hikari: data-source-properties:..

2021.01.28 게시됨

스터디/JPA

단방향 @OneToMany 관계에서 발생 할 수 있는 문제점

모든 예제코드는 Github에서 확인 할 수 있다. 김영한님의 JPA 책을 공부하면 단방향 @OneToMany를 사용하는 것을 지양하라고 한다. 외래키 관리의 주체가 아닌 쪽에서 연관 관계를 관리 하게 됨으로써 발생하는 문제들이 있기 때문인데 이 부분에 대해 살펴보고자 한다. 준비 설정 실습에는 flyway로 DB 스키마를 정의하고 생성하였고 application.yml에 hibernate의 ddl-auto 설정을 validate로 설정해 두었다. implementation 'org.flywaydb:flyway-core' spring: jpa: hibernate: ddl-auto: validate 모델 모델은 Menu - MenuProduct 관계로 One to Many로 이어져 있다. CREATE TA..

2020.12.06 게시됨

스터디

정적, 비정적 클래스 알고 사용하기

자바의 중첩 클래스(Nested Class)에는 여러 가지 종류가 있는데 그중 정적 내부 클래스와 비정적 내부 클래스에 대해 다뤄보고자 한다. 글에서 사용된 코드는 Github에서 확인할 수 있다. 중첩 클래스란 정적, 비정적 내부 클래스에 대해 다루기 전에 중첩 클래스가 생소할 수 있기 때문에 먼저 중첩 클래스에 대해 설명을 하고자 한다. 중첩 클래스는 말 그대로 다른 클래스의 내부에 존재하는 클래스를 의미한다. 중첩 클래스는 특정 클래스가 한 곳(다른 클래스)에서만 사용될 때 논리적으로 군집화하기 위해 사용한다. 이로 인해 불필요한 노출을 줄이면서 캡슐화를 할 수 있고 조금 더 읽기 쉽고 유지 보수하기 좋은 코드를 작성하게 된다. 정적, 비정적 선언 정적 내부 클래스와 비정적 내부 클래스를 나누는 기..

2020.11.06 게시됨

스터디/스프링

Spring Boot에서 properties 값 주입받기

개요 Spring Boot를 이용해서 어플리케이션을 만들다 보면 외부에서 특정 값들을 주입받아야 하는 경우가 있습니다. 예를 들면 AWS의 특정 컴포넌트를 사용하기 위한 secret key가 될 수도 있고 외부 API를 사용하기 위한 API key가 될 수도 있습니다. 이러한 값들을 소스 코드에 하드 코딩한다면 악의적인 의도를 가진 사람이 값을 탈취하여 사용하면서 큰일로 이어질 수 있습니다. 따라서 이렇게 중요한 값들을 application.properties 혹은 application.yml 과 같은 외부 설정값을 관리하는 파일에 적어두고 사용하기도 하고 .jar 파일을 실행하기 위한 커맨드에서 직접 값을 넘겨주기도 합니다. 이번 글은 Spring Boot에서 외부 파일(ex.application.pr..

2020.10.15 게시됨

스터디/JPA

fetch join 과 limit 을 같이 쓸 때 주의하자. (firstResult/maxResults specified with collection fetch)

결론부터 말하면 One에서 Many를 fetch 해야하는 경우 limit과 같은 절(Pagination을 위한)을 포함하면 원하는 대로 결과나 나오지 않는다. 예제코드(+ 테스트코드)는 Github에서 확인할 수 있다. LIMIT 그리고 SET_MAX_RESULT JPQL Pagination을 위해서는 MySQL 기준 limit (그리고 offset) 을 사용해야 한다. 그런데 JPA은 DB에 따라서 방언을 바꾸어 Query를 생성하기 때문에 MySQL 방언에 속하는 LIMIT 절을 JPQL에서 직접 사용할 수 없다. 따라서 아래와 같이 쿼리를 작성하면 QuerySyntaxException, IllegalArgumentException 이 발생한다. @Query("SELECT a FROM Article ..

2020.10.08 게시됨

스터디/스프링

Spring Boot에서 Spring Bean 초기화 과정에 대해 알아보자.

Spring Boot를 사용하면 자연스럽게 Spring Bean을 직접 생성하고 사용할 일이 많아진다. 따라서 우리는 Spring Bean을 생성하는 방법은 당연히 알고 있어야 하고 더 나아가 어떠한 방식으로 등록되는지 알고 있어야 한다. 이 글에서 개발자가 생성하거나 Spring Boot가 제공하는 Spring Bean을 어떻게 사용할 수 있게 되는지 간략하게 알아보도록 하자. Spring Bean을 만드는 방법 개발자가 직접 Spring Bean을 만드는 방법은 두 가지가 있다. @Component 어노테이션을 이용하는 방법과 @Bean 어노테이션을 이용하는 방법이다. @Component 어노테이션의 경우 아래와 같이 클래스에 명시해 주면 된다. @Component public class MyCust..

2020.10.05 게시됨