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

이전 게시글에 이어서 Entity와 DTO 간의 변환 방법에 대해 소개하겠다. [Spring] DAO, DTO, Entity, 기본 계층 설계 계층 구조를 유지하기 위해서는 데이터베이스의 Entity와 DTO 간의 변환이 빈번히 일어나게 된다. 개발 초기 단계에서는 자주 클래스의 field들이 바뀌거나 추가된다. 이때 Entity와 DTO 간의 변환의 역활을 하는 기능은 field의 변동이 있을 때마다 계속 수정을 해주어야 한다. Entity의 종류가 한두개면 모르겠지만, 수십 개가 있다면 이러한 작업은 반복적일 뿐만 아니라 유지보수도 힘들다. 라이브러리 추가 이를 위해 자바 진영에서 사용하는 라이브러리가 MapStruct이다. https://mapstruct.org/ MapStruct – Java be..
문제 https://leetcode.com/problems/longest-repeating-character-replacement/ Longest Repeating Character Replacement - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 난이도: Medium 풀이를 이해하기도 힘들었던 어려운 문제였다. 일단 문자열의 최대길이는 50,000이므로 단순히 전부 시도해보는 것은 무리다. 정답인 위치의 subString을 생각해보자. 해당 subS..
문제 https://leetcode.com/problems/longest-substring-without-repeating-characters/ Longest Substring Without Repeating Characters - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 난이도: Medium 일단 본인의 풀이를 소개하고 나서 더 간단한 방법을 설명하겠다. 먼저, 문자열의 각 (idx 번째)문자로 부터 오른쪽으로 이동하여 가장 가까운 같은 문자가 나오..
문제 Word Search - LeetCode Word Search - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 난이도: Medium Matirx로 분류되어 있지만, DFS로 해결 가능한 문제였다. 간단히, 문자열의 시작 문자와 동일한 위치에서부터 상하좌우 네 방향을 DFS로 탐색해 나가면 된다. 너무 간단하므로 아래에서는 follow-up 문제까지 고민해보기로 하자. DFS 풀이 코드 좀 더 생각해보기 (pruning) 이번 문제의 follow-up..

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

문제 https://leetcode.com/problems/rotate-image/ Rotate Image - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 난이도: Medium 이것도 일반적으로 푼다면 다음과 같이 순서를 읽어버리면 된다. 하지만 In-place 알고리즘으로 해결해야 하므로, 2차원 배열을 새로 생성하는 과정을 진행하면 안 된다. 이를 위해 어쩔수 없이 2차 for문으로 하나 하나 이동시켜야 한다. 이때 2차원 행렬을 양파의 껍질(shel..

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..