Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/

C++에서 Vector를 생성할 때 일일이 복사해 주거나 copy 메서드 혹은 assign 메서드를 활용할 수 있지만, 생성 시에 값을 복사해 주는 방법으로 복사 생성자(copy constructor)가 존재한다. 이는 복사 대상 Vector의 iterator를 활용하면 설정한 시작(first)과 끝(last)까지 순서대로 복사시켜 새로운 vector를 만들어준다. vector copyVector(first, last); void copyCheck() { vector vec = {1,2,3,4,5,6 }; vector subCopyVec(vec.begin() +1 , vec.begin() + 4); for (auto it = subCopyVec.begin(); it!= subCopyVec.end(); i..

Spring과 MySQL을 연동하기 위해 모든 세팅을 맞추고 실행도 잘 되었다. 하지만, 재부팅만하면 MySQL root 계정 접속 시, 'Access denied for user 'root'@'localhost' (using password: YES)' 라는 오류를 계속 만나게 된다. 문제는 이 오류가 비밀번호가 맞지 않아 발생하는 오류인데, 분명 맞는 번호를 입력해도 'Access denied for user 'root'@'localhost' (using password: YES)' 오류 만이 발생하였다. 몇번을 MySQL을 재설치 하더라도 재부팅만 하면 동일한 현상이 발생한다. 포기하고 이전에 사용하던 MariaDB를 적용해보기 위해 MariaDB를 테스트하던 중 설마 둘이 충돌이 난건 아닐까 생각..

외래키의 위치 일단 데이터베이스의 개념부터 설명하고 들어가자. 두개의 엔티티가 관계(연관)를 가지면 외래키가 두 엔티티중 하나에 들어가야한다. 예를 들어 프로젝트와 프로젝트 매니저 사원의 관계를 생각해보자. 프로젝트에는 단 한명의 매니저가 반드시 존재한다. (프로젝트가 관계에 완전 참여) 따라서 소수의 인원만이 프로젝트 매니저가 된다. (사원은 관계에 부분 참여) 즉, 다음과 같이 표현된다. 일단, 사원 테이블에 자신이 매니저를 맞고있는 컬럼이 있다고 생각해보자. 해당 컬럼은 프로젝트의 기본키를 외래키로 가져오게 된다. 그러나 소수의 사원만 매니저를 담당하므로 대부분의 사원에게는 NULL 값이 삽입되어야 한다. 수 많은 사원들의 해당 필드값이 NULL로 채워진다면, 공간을 낭비하게 된다. 반대로 프로젝트..
MariaDB로 새로 JPA를 공부하다 미칠뻔한 오류를 만나 정리해본다. .... spring.jpa.hibernate.ddl-auto=create-drop Maria DB에서는 application.properties 에 이와 같은 설정을 해두면 Entity 저장시 자동으로 SQL 구문이 생성되어 Table이 새로 만들어진다. 그래서 본인은 일단 두개의 엔티티가 서로를 참조하게 만들었는데, 하나는 테이블이 잘 생성이 되지만 하나는 죽어도 오류가 나면서 spring error: 1146-42s02: table doesn't exist 오류가 발생했다. 이리저리 구글링을 해보며 해결법을 적용을 해보아도 해결이 되지 않았는데 전체 오류를 천천히 읽어보니 Table 생성 sql 구문 다음에 이와 같은 오류를 ..

이전 게시글에 이어서 Entity와 DTO 간의 변환 방법에 대해 소개하겠다. [Spring] DAO, DTO, Entity, 기본 계층 설계 계층 구조를 유지하기 위해서는 데이터베이스의 Entity와 DTO 간의 변환이 빈번히 일어나게 된다. 개발 초기 단계에서는 자주 클래스의 field들이 바뀌거나 추가된다. 이때 Entity와 DTO 간의 변환의 역활을 하는 기능은 field의 변동이 있을 때마다 계속 수정을 해주어야 한다. Entity의 종류가 한두개면 모르겠지만, 수십 개가 있다면 이러한 작업은 반복적일 뿐만 아니라 유지보수도 힘들다. 라이브러리 추가 이를 위해 자바 진영에서 사용하는 라이브러리가 MapStruct이다. https://mapstruct.org/ MapStruct – Java be..

DTO(Data Transfer Object) 스프링은 크게 아래의 3가지 계층로 나눠진다. 컨트롤러 - 비즈니스 - 데이터 이때 계층 사이에 이동하는 데이터는 항상 같은 클래스를 이용하는 것이 아니다. 실제로 데이터베이스에 저장되는 엔티티 클래스를 모든 계층에서 사용하기 보다는 DTO(Data Transfer Object)로 변환하여 정말 필요한 데이터와 로직만을 담는다. 예를 들어 DTO는 데이터 이동만을 담당하므로 setter와 같은 매서드를 포함시키지 않는 방식이다. 아래의 그림 처럼 데이터베이스와 관련이 있다면 Entity로 다루고, 데이터 쪽에서 멀어질 수록 간단한 DTO로 데이터를 다룬다. 비즈니스 계층과 데이터 계층간의 데이터 이동은 DTO 또는 Entity를 사용한다. 이는 팀별 업무 규..

MongoDB의 document의 최대 크기는 16MB이다. 따라서 여러 사진이 저장되는 document는 16MB를 초과하여 저장되지 않는 오류가 발생할 수 있다. 이때는 GridFS를 이용하여 데이터를 분할 저장한다. GridFS는 두가지 종류의 document를 사용해서 저장된다. 이는 위의 그림에서 확인할 수 있듯이 fs.files와 fs.chunks이다. fs.files는 해당 데이터의 정보(크기, 생성 일시, 이름 등)이 저장되어 있고, 원하는 metaData도 삽입할 수 있다. 실질적인 대용량 데이터는 fs.chunks들에 256KB 크기로 분할되어 저장된다. chunk들이 자신의 상위 file의 id값을 가져서 참조하게된다. Configuration 설정 GridFS 파일 저장 이때의 in..

DB의 핵심은 역시 참조 관계의 설정이다. Spring Data MongoDB는 어노테이션을 통한 참조 관계 맵핑을 지원한다. 이전에는 주로 @DBRef 진행하였지만, Spring Data MongoDB 3.3.0부터 지원하는 @DocumentReference 어노테이션으로 설정해보자. Ingredient 문서가 Recipe를 참조하도록 @DocumentReference를 적용하였다. MongoDB의 장점은 다른 SQL DB와 다른게 일대 다 매핑을 위해 @OneToMany와 같은 어노테이션 적용이 필요없다는 점이다. @DocumentReference private List recipes; List로 Recipe를 참조하므로 Ingredient 문서 하나가 여러개의 레시피와 매핑된다. Ingredient..

공식 문서에도 잘 정리되어 있지만, 초심자 입장에서는 알 수 없는 오류를 많이 만나서 정리해본다. 다음 공식 문서를 따라 하면 된다. https://spring.io/guides/gs/accessing-data-mongodb/ Accessing Data with MongoDB this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team spring.io 일단 몽고 DB를 설치하자. 하진쓰님의 게시글을 따라 하면 쉽다. 본인의 경우에는 6.0 버전을 설치했지만 제대로 설치가 되지 ..

* 김영한님의 스프링 DB 2편 강좌를 수강하며 정리한 글입니다. * 스프링 DB 2편 - 데이터 접근 활용 기술 - 인프런 | 강의 백엔드 개발에 필요한 DB 데이터 접근 기술을 활용하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의 소개 | 인 www.inflearn.com 이전 글에서는 스프링 트랜잭션의 방식에 대해 정리하였다. 이번에는 트랜잭션 간의 복잡한 상황에서 스프링의 대처를 확인해보자. @Test void double_commit(){ log.info("트랜잭션1 시작"); TransactionStatus tx1 = txManager.getTransaction(new DefaultTransactionAt..