전체 글

80세까지 코딩하는 것이 목표인 개발자의 골방
· Spring
프로젝트 진행 중 로깅을 하고 로그를 저장할 방법이 필요했습니다. Spring의 인터셉터를 이용하여 로깅을 구현하였고 ThreadLocal을 통해서 트랜젝션 아이디를 기록했습니다. 먼저 인터셉터입니다. @Slf4j public class RequestInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uuid = UUID.randomUUID().toString(); // (1) String requestURI = request.getMeth..
https://school.programmers.co.kr/learn/courses/30/lessons/67259 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 처음에 2차원 DP + DFS로 접근했지만 2차원으로는 해결할 수 없는 문제가 있었다. 그래서 해당 접근은 보류하고 처음부터 다시 생각했고, 방향에 따라서 간선의 가중치가 달라진다는 점과 최단 거리를 구해야한다는 점을 토대로 다익스트라 알고리즘을 사용해서 문제를 풀었다. 이 문제는 진행 방향에 따라서 도로 건설 비용이 달라질 수 있음을 고려해주어야 한다. 아래는 문제에서 설명을 위해 첨..
· DB
이슈 내용 unique 제약을 통해 중복을 검사하면 안 될까? 결론 중복 검사 방법에는 두 가지 방법이 있습니다. 1. 직접 select 해서 체크하는 방법 이 방법은 원하는 대로 예외를 터트릴 수 있고 훨씬 명확한 코드를 제공할 수 있습니다. 하지만 동시성 이슈가 발생할 수 있습니다. 2. DB UNIQUE 제약에 의존하는 방법 사실 DB 관련 예외가 터지면 이걸 일일이 잡기가 애매합니다. 따라서 공통 예외로 처리하여 사용자에게 서버 쪽에 문제가 있다 정도로만 알릴 수 있습니다. 3. 뭐가 더 좋을까 1번 방법은 동시성 이슈가 발생한다는 단점이 있습니다. 하지만 실제 상황에서 동시성 이슈가 발생할 일은 극히 드뭅니다. 따라서 우선은 1번 방법을 사용해서 원하는 로직으로 깔끔하고 명확하게 구현하고 DB에..
· JAVA
스레드 상태 주기 스레드의 상태 주기는 다음과 같다. 빨간색 표시는 Deprecated 된 메소드를 의미한다. Thread 클래스에서 getState()가 제공하는 Thread.State 열거 상수는 스레드의 상태를 나타낸다. 상태 열거 상수 설명 객체 생성 NEW 스레드 객체가 생성, 아직 start() 메소드가 호출되지 않은 상태 실행 대기 RUNNABLE 실행 상태로 언제든지 갈 수 있는 상태 일지 정지 WAITING 다른 스레드가 통지할 때까지 기다리는 상태 TIMED_WAITING 주어진 시간 동안 기다리는 상태 BLOCKED 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태 종료 TERMINATED 실행을 마친 상태 간단하게 스레드의 State를 얻어서 출력해보자. 컴퓨터 사양이 좋아서 ..
· JAVA
1. 기본 네트워킹 java에서 TCP/IP 네트워킹은 ServerSocket과 Socket을 이용한다. ServerSocket은 특정 포트에 바인딩해서 클라이언트의 연결 요청을 기다린다. Socket은 클라이언트가 서버에게 연결을 요청하고 통신을 수행하는 용도로 사용하거나 서버에서 클라이언트와 통신하기 위한 용도로 쓰인다. ServerSocket을 생성하는 방법은 다음과 같고, 이미 사용 중인 포트에 바인딩을 하면 BindException이 발생할 수 있으므로 주의하자. // ServerSocket 생성과 바인딩을 동시에 수행 ServerSocket serverSocket = new ServerSocket(5001); // 따로 수행 ServerSocket serverSocket = new Server..
· JAVA
자바에서 데이터는 스트림을 통해 입출력되므로 스트림의 특징을 잘 이해해야 한다. 스트림은 단방향이라는 특성이 있어 입력과 출력용 두 가지 스트림이 존재한다. 자바의 기본적인 IO API는 java.io 패키지에서 제공하고 있다. java.io 패키지의 주요 클래스 설명 File 파일 시스템의 파일 정보를 얻기 위한 클래스 Console 콘솔로부터 문자를 입출력하기 위한 클래스 InputStream / OutputStream 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스 FileInputStream / ...OutputStream 바이트 단위 입출력을 위한 하위 스트림 클래스 DataInputStream / ...OutputStream ObjectInputStream / ...OutputStrea..
· JPA
JPA는 다음과 같은 상속관계에서 세 가지의 상속관계 매핑을 지원한다. InheritanceType.JOINED: 조인 전략 InheritanceType.SINGLE_TABLE: 단일 테이블 전략
· JPA
흔한 경우는 아니겠지만 가끔 필요할 때가 있다. 예를 들어 카테고리는 다른 카테고리를 가리키면서 계층을 형성한다. 그런데 계층마다 이름만 다른 똑같이 생긴 카테고리 클래스를 생성해서 관계를 맺는 것은 비효율적이다. 이런 경우 같은 카테고리 클래스끼리 다대일 양방향 관계를 맺는 것이 편리하다. 아래는 카테고리 클래스로 다대일 양방향 관계를 맺은 모습이다. @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; String..
우리 프로젝트에는 모임 : 게시글 : 댓글 : 대댓글이라는 연관관계가 있다. 모두 1:N 양방향 관계이며 게시글 삭제 시 연관 댓글, 대댓글 삭제가 이루어져야 하는 구조이다. 삭제가 조금 번거롭다. 그래서 영속성 전이를 사용하면 쉽게 제거할 수 있지 않을까? 하고 테스트를 진행해 보았다. 아래는 테스트 로그이다. parent의 존재 여부를 확인하고 children의 존재 여부를 확인한 후에 child 삭제 후 parent 삭제를 진행한다. Hibernate: select parent0_.id as id1_5_0_, parent0_.name as name2_5_0_ from parent parent0_ where parent0_.id=? Hibernate: select children0_.parent_id..
@xftg77g
뇌장하드