목록전체 글 (279)
HwangHub
문제 상황 분명 PK 자동생성 전략을 사용하였는데, 위와 같은 에러가 발생하였다. 엔티티를 정의한 방식은 아래와 같다. @Entity public class Post extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "post_id") private Long id; ... } 해결 스택오버플로우에 따르면, "경우에 따라 모델이나 ORM은 데이터베이스의 변경사항이 정확하게 반영되지 않을 수 있다.(SchemeUpdate) 코드 상의 오류를 정확히 파악할 수 없다면 다시 만들어보세요.(SchemeExport)" 라고 한다. 아무래도 ddl update 방식으로는 generate strat..
문자열의 길이를 제한하는 어노테이션에 대해 알아보다가 쓱 보기엔 유사해보이는 어노테이션들이 있어서 한번 간단하게 정리해 보았다. @Column(length=value) DB 필드의 물리적인 글자수 제약조건을 거는 어노테이션이다. value에 적절한 값을 입력해두면 Jpa에 ddl을 수행할 때 DB 칼럼의 문자열 길이 제약조건을 걸어둔다. @Size(min=val, max=val) 자바에서 기본적으로 validation을 지원하기 위해 제공하는 어노테이션이다. 이를 requestDto 등에 이용하여 입력되는 문자열의 validation을 처리할 수 있다. @Length(min=val, max=val) 하이버네이트에서 지원하는 validation 어노테이션이다. 기능 자체는 @Size와 동일하다고 이해할 수..
문제 상황 기존에 작업에서는 게시글 엔티티가 아래와 같이 선언되어 있었다. @Entity public class Post extends BaseTimeEntity { ... @Column(length = 500) private String title; @Column(length = 50000) private String body; ... } 본문 필드에 50000으로 받겠다고 선언되어있었는데, 이는 일반적이지 않은 선언이다. 우선 mysql 기준 레코드 전체 크기가 65,535 bytes로 제한되어 있으므로, 50000과 같은 길이 설정 자체에서 오류를 일으키기도 하고, 그것 외에도 실제 생성하면서도 레코드가 생성되지 않고 에러를 발생시킬 수 있기 때문이다. 반면, 일반적으로 긴 문자열을 저장하기 위해 ..
data jpa에서는 persistenceContext라는 개념이 존재하고, 엔티티 스냅샷을 비교하여 dirtyChecking을 수행하는 방식으로 운영된다. 따라서 엔티티가 persistence layer 이외에 노출되는 것은 엔티티에 대하여 불필요한 엑세스 포인트를 과하게 노출시키는 행위이며, 만약 협업을 하다가 로직이 꼬이게 되면 의도치 않은 엔티티 수정이 발생될 수 있다. 그 외에도 여러가지의 '안정성'을 위한다는 이유들로 persistence layer 이외의 레이어에서는 dto 사용이 적극 권장된다. 가지고 있던 문제는? 멋대플랫폼 아키텍처의 처음 구현 방식에서는 엔티티가 useCase라는 client 객체에서부터 사용되고 있었다. 처음 presentation layer에서 dto로 reques..
기존에는 유저 ID를 클라이언트에서 입력하도록 API가 설계되어 있었다. 즉, Controller 레벨에서 pathVariable 또는 requestParam으로 userId를 받고 있었다. 아래는 api 중 유사한 api의 예시이다. @GetMapping("/mypage/author/{userId}") public SuccessResponse findAuthorPosts(@PathVariable Long userId, @RequestParam Integer page, @RequestParam Integer size) { ... return SuccessResponse.of(response); } 문제가 무엇인가? 클라이언트는 엑세스 토큰, 리프레시 토큰을 가지고 있음에 불과하고, 로그인 유저 정보를 관..
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 해석 k개의 도시를 중복 없이 골라야 하므로, 백트래킹을 통해 k개의 도시를 선정한 뒤, 각 시작점으로부터 BFS를 통해 탐색을 해서 이동 수의 최대를 뽑아내면 된다. u 이상 d 이하인 것을 검사하는 로직은 canGo()에서 검사하면 된다. 문제 풀이 백트래킹으로 k개의 도시를 고른다. (중복이 없어야 하므로 selected[][] 활용) 모든 경우를 탐색해야 하므로 적절하게 isVisited[][]를 초기화해줘야 한다. import javax.swing.*; import java.io.Buffe..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cT8H8H/btsxh8GlPF8/16I16X6Hhba0Pc8UDZs9L1/img.png)
문제 해석 이 문제는 돌을 골라내는 조합 로직 + 탐색 로직이 필요하므로 백트래킹 + BFS로 풀 수 있겠다 판단하였다. 결론적으로, 해석까지는 좋았는데, 로직의 구현 단계에서 디테일이 부족하여 틀리고 말았다. 문제 풀이 package 코드트리.그래프.BFS; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class 돌_잘_치우기 { private static int n, m, k; private static int[][] arr; private static int ans; private static List sPos = new Array..
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 해석 위 문제는 2차원 배열 위에서 상하좌우로 움직이며 최댓값을 찾는 것을 반복하되, 움직이는 과정에서 무한으로 돌지 않도록 방문한 곳은 두번 방문하지 않아야 하며, 처음 시작한 곳의 숫자보다 작은 곳만 탐색할 수 있다. 이러한 방식은 그래프 알고리즘으로 구현이 가능하다. 일단은 코드트리에서 의도한 방향이 BFS이므로 BFS로 구현해보고, 나중에 다시 풀때 DFS로 가능한지 한번 살펴볼 예정이다. 문제 풀이 package 코드트리.그래프.BFS; import java.io.BufferedReader..
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석 국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요. www.codetree.ai 문제 해석 위 문제는 완탐 시뮬레이션 문제로 이해할 수 있다. 사실 이 문제는 로직 구성은 간단한데 문제를 잘 읽어야 한다는 게 포인트인 것 같다. 숫자들이 두 줄의 컨베이어 벨트 위에 있는 것으로 정의되는데, 아래 줄 숫자들은 반전되어 보여진다는 게 일종의 장애물 포인트이다. 이를 고려하지 않고 ver1.0의 로직을 구성해서, 그 이후에 적용할 때에는 기존 입력이나 출력을 뒤집어서 수행하여 기존 로직을 사용할 수 있도록 하였다. 문제 풀이 import java.io.BufferedReader; impo..
프로젝트를 진행하면서 각 도메인의 작업물을 stage 브랜치로 merge하고 나니 팀원 중 한 명이 필드 인젝션을 사용한 것을 확인할 수 있었다. 본능적으로 "어라? 왜 생성자 인젝션을 사용하지 않았지?"라는 생각이 들었는데, 스스로 필드 인젝션의 위험성에 대한 이유를 명확히 댈 수 없음을 깨달았다. 따라서 이번 기회에 정리하고자 한다. 의존성 주입 방법 3가지 스프링부트를 활용하면서 의존성을 주입하는 방법은 대표적으로는 3가지가 있다. Setter 주입 생성자 주입 필드 주입 이는 @Autowired 어노테이션을 Setter, 생성자, 필드에 선언해주는 것으로 구현한다. 따라서 이 방법들을 알아보기 전에 @Autowired 에 대해 간단하게 짚고 넘어가고자 한다. @Autowired란? docs.spr..