Java에서 MySQL에 저장된 datetime 형식의 데이터를 가져올 때 시간차가 발생할 수 있다. 오늘은 이 시간 차이를 해소할 수 있는 방법에 대해서 알아본다. 문제 상황 토이 프로젝트 진행 중 MySQL에 저장된 created_at과 자바의 createdAt의 값이 일치하지 않는 경우가 발생했다. 주문 후 DB에 저장된 값과 JSON으로 전달되어 웹에 렌더링한 값을 비교해본다. DB에는 created_at이 2021-09-24T15:47:43 으로 저장된 반면 웹 페이지에는 createdAt이 2021-09-25T00:47:43로 출력된다. 웹 페이지에 렌더링된 값 보다 DB에 저장된 값이 정확히 9시간이 빠르다. 문제 분석 웹 페이지에 렌더링된 값이 DB 보다 9시간이나 늦은 이유는 타임존이 달..
오늘은 Spring MVC의 구조에 대해 알아본다. MVC 패턴 MVC 패턴은 웹 애플리케이션의 구조를 Model-View-Controller로 역할을 나눈 디자인 패턴을 의미한다. 먼저 MVC 패턴의 등장 배경에 대해서 알아본다. MVC 등장 배경 상품 관리 서비스를 개발한다고 가정하자. 상품 관리 서비스에는 상품 등록, 수정, 삭제가 있다. MVC 패턴을 적용하지 않았을 때 MVC 패턴을 적용하지 않고 서블릿만을 사용하여 상품 등록 뷰를 클라이언트에게 전달하기 위해서는 Response Body에 직접 HTML를 작성하여 응답해야할 것이다. 그리고 아래와 같이 등록할 상품 정보를 전달받아 DB에 저장하는 역할의 서블릿도 저장 결과를 클라이언트에게 전달하기 위해 서블릿에서 직접 HTML을 작성해야한다. ..
트랜잭션 서비스 추상화 트랜잭션 웹 커뮤니티에서는 조건에 맞는 모든 사용자의 등급을 업그레이드 시키는 것과 같은 작업이 있다. 만약 사용자의 등급을 업그레이드 시키는 과정에서 예외가 발생하여, 업그레이드가 완료되지 않은 사용자가 존재한다면 불만을 표출할 수 있을 것이다. 따라서 커뮤니티 사용자들의 등급을 업그레이드 시키는 것은 논리적인 하나의 작업단위로 보고, 전체가 다 성공하던지 하나라도 실패하면 모두 실패하던지 해야한다. 즉 사용자들의 등급 업그레이드는 나눌 수 없는 원자적인 작업이라는 것이다. 이러한 더이상 나눌 수 없는 논리적인 작업 단위를 트랜잭션이라한다. 트랜잭션의 경계 DB는 그 자체로 완벽한 트랜잭션을 지원한다. SQL을 통해 다수 레코드의 수정 및 삭제를 위한 요청을 했을 때, 일부만 수..
오늘은 서블릿의 개념에 대해서 알아본 후, 실제로 자바와 스프링에 구현된 코드를 보며 컴포넌트들의 역할을 이해해본다. Servlet 서블릿은 클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바의 프로그래밍 기술이다. 컨테이너가 클라이언트의 동적인 요청을 처리할 수 있도록 도와주는 컴포넌트인 것이다. 일반적으로 웹 서버는 클라이언트의 정적인 요청에만 응답하고 동적인 요청에 대한 처리는 웹 컨테이너에게 위임한다. 이 때 웹 컨테이너는 클라이언트의 HTTP Request를 해석해서 HttpServletRequest 객체를 생성하고, 응답을 전달해줄 수 있는 HttpServletResponse 객체를 생성한다. 그리고 웹 컨테이너는 요청 URL에 매핑되는 적절한 서블릿..
웹 기본 Spring MVC를 정리하기 이전에 웹의 기본 지식을 짚고 넘어가겠습니다. HTTP 먼저 HTTP에 대해서 간단하게 알아보겠습니다. 자세한 내용은 추후 업로드 할 예정입니다. HTTP(HyperText Transfer Protocol)는 HTML 문서와 같은 데이터를 주고 받기 위한 통신 규약입니다. HTTP의 가장 큰 특징은 클라이언트-서버 아키텍쳐, 비연결성, 비상태성 프로토콜이라는 것입니다. 클라이언트-서버: 클라이언트와 서버가 분리되어 요청(Request)/응답(Response) 메시지를 교환하며 통신합니다 비연결성: 클라이언트가 서버에 요청하고, 서버가 이에 응답하면 바로 연결이 끊어집니다. 비상태성: 연결을 끊는 순간 통신이 종료되며 서버는 클라이언트의 정보를 저장하지 않습니다. H..
예외 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보되는 것이 예외 처리의 핵심 원칙이다. 잘못된 예외처리 예외를 처리하는 가장 기본적인 방법은 try-catch 구문을 사용하는 것이다. 하지만 catch 구문에서 아무 작업도 하지 않는 코드들이 발견되는데 이러한 코드는 잘못된 코드이다. try { ... } catch (Exception e) { // 아무것도 하지 않음 } 예외를 제대로 처리하지 않아 메모리나 리소스가 소진되거나 결과적으로 오작동으로인한 시스템 오류가 발생할 수 있다. 아래 두 가지 경우도 마찬가지로 좋지 않은 예외 처리이다. 단순히 예외 메시지를 처리하는 것은 올바른 예외처리 방법이 아니다. try { ... } catch (Except..
3장 템플릿 JDBC 리소스 반환 JDBC의 Connection 이나 PrepareStatement는 풀 방식으로 동작한다. 여기서 풀 방식은 제한된 개수의 DB 커넥션을 만들어서 재사용 가능한 풀을 만드는 것을 의미한다. 리소스 반환을 위해 close() 메소드를 호출하는데, 만약 예상치 못한 에러로 인해 리소스를 반환하지 못한다면 커넥션 풀의 여유가 없어지고 결국 리소스가 모자라는 에러를 발생시킬 수 있다. public void deleteAll() { Connection c = dataSource.getConnection(); PrepareStatement statement = c.prepareStatement("DELETE FROM users"); statement.executeUpdate(); ..
문자열 지옥에 빠진 호석 주어진 이차원 배열을 8 방향으로 이동하며 가능한 모든 문자의 수를 구하고, 신이 좋아하는 단어가 나타나는 개수를 구하는 문제입니다. 문제의 조건은 아래와 같습니다. 이 세상은 N행 M열의 격자로 생겼으며, 각 칸에 알파벳이 써있고 환형으로 이어진다. 왼쪽 위를 (1, 1), 오른쪽 아래를 (N, M)이라고 하자. 너는 아무 곳에서나 시작해서 상하좌우나 대각선 방향의 칸으로 한 칸씩 이동할 수 있다. 이 때, 이미 지나 왔던 칸들을 다시 방문하는 것은 허용한다. 시작하는 격자의 알파벳을 시작으로, 이동할 때마다 각 칸에 써진 알파벳을 이어 붙여서 문자열을 만들 수 있다. 이 곳의 신인 내가 좋아하는 문자열을 K 개 알려줄 터이니, 각 문자열 마다 너가 만들 수 있는 경우의 수를 ..
2장 테스트 IoC, DI, Test 스프링의 핵심인 IoC와 DI는 오브젝트의 설계와 생성, 관계, 사용에 관한 기술 객체지향 프로그래밍 언어의 근본과 가치를 개발자가 손쉽게 적용할 수 있다 테스트는 만들어진 코드를 확신할 수 있게 하고, 변화에 유연하게 대처할 수 있게한다 테스트의 유용성 테스트는 내가 예상하고 의도했던 대로 코드가 정확히 돌아가는 지 확인하여, 코드에 확신을 가질 수 있게 하는 작업 웹 개발에서 테스트를 진행하면, 데이터가 웹 화면에 보여지기까지 개발을 진행해야한다 하지만 이러한 테스트는 시간도 오래 걸릴 뿐더러 테스트의 실패 원인이 테스트 대상에 있다는 보장도 없다. 따라서 단위 테스트를 진행해야한다 단위 테스트 작은 단위의 코드에 대해 테스트를 수행하는 것을 단위 테스트라고한다...
카카오 2020 공채 외벽 점검 해설입니다 브루트 포스 알고리즘을 통해 해결할 수 있는 문제입니다. 문제 해결의 핵심 조건들은 다음과 같습니다 레스토랑의 구조는 완전히 동그란 모양이다 외벽의 총 둘레는 n 미터이다 레스토랑의 구조가 원형이기 때문에 Circular Array로 접근해야 합니다. 그리고 이동 방향이 시계 방향이든 반시계 방향이든 중요하지 않습니다. 레스토랑이 원형이기 때문에 10 -> 1 -> 5 -> 6 이던 5 -> 1 -> 10 -> 6 이던 동일하기 때문입니다. 이제 외벽을 점검할 친구들을 골라야합니다. 그런데 당연하게 이동거리가 큰 친구들을 먼저 사용하면 최대한 적은 친구들을 동원할 수 있을 것 입니다. 따라서 dist 배열을 정렬합니다. 그리고 수리할 취약 지점의 순서를 perm..