Mysql에서 날짜와 시간을 저장할 때 자주 사용되는 데이터 타입인 DATETIME과 TIMSTAMP는 비슷해 보이지만, 중요한 차이점을 가지고 있습니다. 이 글에서는 두 데이터 타입의 차이점에 대해서 알아보고, 간단하게 실습을 해보겠습니다.실습에 사용된 Mysql 버전은 9.1.0입니다. 차이점DATETIME : 날짜와 시간을 YYYY-MM-DD HH:MM:SS 형식으로 저장하는 데이터 타입입니다.- 시간대(Timezone)에 영향을 받지 않습니다.- 저장 범위: 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 TIMESTAMP: Unix Epoch Time(1970년 1월 1일 00:00:01 UTC) 이후의 초 단위로 저장합니다.- 시간대(TimeZone)에 영향을 받습..
안녕하세요 ! 오늘은 Java에서 제공하는 강력한 기능 중 하나인 리플렉션에 대해서 알아보겠습니다. 예제에 쓰인 모든 코드는 깃허브 에서 확인하실 수 있습니다. 리플렉션이란?리플렉션이란, 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능입니다. 리플렉션을 이해하기위해서 먼저 JVM의 동작 방식에 대해 살펴볼 필요가 있습니다. 1. Java 컴파일러(javac)가 소스코드를 바이트 코드(.class)로 변환합니다. 2. 컴파일된 바이트 코드를 클래스 로더에게 전달합니다. 3. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 링크하여 런타임 데이터 영역에 올립니다. 여기서 리플렉션은 Method Area의 클래스 정보들을 조작할 수 있는 기능입니다. 어떻게 Method Area에 접근하는가?..
Inner Class를 Bean으로 등록할 수 없는 경우public class OuterClass { @Component class InnerClass { }}스프링 프로젝트 내부에 위와 같이 선언한 이너 클래스가 있습니다. 이너 클래스에 @Component를 붙여서 Bean으로 등록하려 하면 과연 Bean으로 등록이 잘 될까요? import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplicat..
백엔드 개발을 하다보면 API 명세서를 작성해야 할 일이 많습니다.API 명세서를 작성하는 방법이야 여러가지가 있지만, 저는 개인적으로 사이드프로젝트나 업무에서 Spring의 Restdocs를 이용해서 작성하는걸 선호하는데요, 테스트를 기반으로 문서가 작성되기 때문에 개발 중간에 API 스펙이 변경되면 테스트가 통과하지 못해서 강제로(?) 문서 테스트도 수정해야하기 때문에 실제 API 스펙과 문서에 명시되어 있는 스펙이 달라질 일이 없는 점과, 프로덕션 코드에는 문서 작성을 위한 코드가 전혀 들어가지가 않기에 비교적 깔끔한 프로덕션 코드를 유지할 수 있기 때문입니다.문제는 RestDocs를 처음 적용하려고 할 때 설정이 조금 복잡하고 작성법이 생소하기 때문에, 실험적으로 작성하시는 분들께는 꽤나 버거울 ..
java로 개발을 하다보면 비동기적으로 처리를 해서 성능을 높여야 하는 경우가 생깁니다. 저 또한 이런 경우가 많았는데요, 이럴 때 Java에서 제공하는 CompletableFuture를 이용하면 쉽게 해결할 수 있습니다. CompletableFuture에 관하여 검색을 해보니, 박우빈님이 작성하신 CompletableFuture 톺아보기 가 가장 정리가 잘 되어 있어서 한번 따라해보고, 해당 글을 기반으로 저 또한 정리를 해두고자 합니다! CompletableFuture란?CompletableFuture는 Java에서 비동기 프로그래밍을 지원하는 강력한 클래스입니다. Java 8부터 도입되었으며, 사용하기에 따라서 Async-Blocking, Async-Non-Blocking 하게 사용할 수 있습니다..
개발을 하다보면, 간단하게 메서드의 실행시간을 측정해보고자 할 일 이 많습니다.그동안 저는 이럴 때 보통 아래처럼 System.currentMillis()를 측정하고자 하는 메서드의 위아래로 찍어 시간을 측정했습니다.public class MyClass { public void MyMethod() { long startTime = System.currentMillis(); // .. 로직 long endTime = System.currentMillis(); long resultTime = endTime - startTime; System.out.println("resultTime = " + resultTime + "ms"); }} ..
안녕하세요? 지난 시간에는 슬랙 알림 메세지를 보내기 위한 토큰발급, 젠킨스 플러그인 설치 및 설정에 대하여 알아보았습니다. 만약 아직 플러그인 설정이 완료되지 않으신 분들은 Jenkins Pipeline Script로 배포 결과 슬랙 알림 메세지로 보내기(1) - 토큰발급, 플러그인 설치 및 설정 을 참고해주시기 바랍니다. 자, 그럼 이번에는 슬랙 알림 메세지를 보내기 위한 파이프라인 스크립트를 작성하고, 실제로 배포 결과를 슬랙 알림 메세지로 받아보겠습니다. Jenkins Pipeline Script로 슬랙 메세지 보내보기파이프라인 스크립트를 작성하기에 앞서 젠킨스 파이프라인은 Scripted와 Declarative 두가지 문법을 지원하는데, 이 글에서는 Declarative Script 문법을 이용..
제가 일하고 있는 회사에서는 CI 도구로 Jenkins를 사용하여 어플리케이션을 배포하고 있습니다. 위 사진과 같은 flow로 배포를 하고 있는데요. 순서는 다음과 같습니다. 1. 개발자는 열심히 개발을 하여 Bitbucket에 코드를 Push합니다.2. 젠킨스에 접속하여 로그인한 뒤, 배포하고자 하는 Item을 실행합니다.3. 젠킨스는 어플리케이션 서버에 ssh 접속하여, 설정된 Shell Script를 실행하여 어플리케이션을 배포합니다. 위와 같은 flow를 통하여 어플리케이션을 "배포" 하는 것 자체는 굉장히 편했지만, 젠킨스에 직접 들어가보지 않는 이상 다른 구성원들은 지금 배포를 하고있는지 아닌지 모르기 때문에 "배포 직전 수동으로 슬랙 채널에 배포 정보를 올린 뒤 배포하기"를 그라운드 룰로 ..
회사에서 신규 서비스를 개발하면서, OAuth2.0을 활용한 소셜 로그인 기능을 개발하게 되었습니다. 이전에도 사이드프로젝트에서 소셜 로그인 기능 개발은 해봤었는데, 단순히 동작하는 것에만 의의를 두고 여러 레퍼런스들을 참고해가며 거의 복사 붙여넣기로 개발을 했었습니다... 거의 맨땅에 헤딩하던 식으로 '구현' 자체는 성공했던 기억이 있는데, 이후 OAuth2.0 흐름에 대하여 정리를 하거나 코드 흐름에 대하여 딱히 다시 돌이켜본 적은 없었기에, 시간이 지나고 나니 머릿속에 아무것도 남아있지 않더군요.. 그래도 한번 해봤던 것과 아예 안해본 것의 차이는 있기에, 다시 보니 기억나는 부분도 있고 이전에 사이드 프로젝트를 진행할 때 보다는 짬바(?)가 좀 늘어서 별 탈 없이 업무는 성공적으로 마무리할 수 있..
어느날, 회사에서 에러 로그를 보던 중 UnexpectedRollbackException이라는 예외가 발생한 에러로그를 발견했습니다. 로그를 읽어보았을 때는 뭔가 기대하지 않은 롤백이 발생했다는 내용같은데, 왜 롤백이 발생했는지 호기심이 생겨 관련 내용을 쭉 파헤쳐 보았고, 그 과정 속에서 알게된 내용들을 글로 정리해두려 합니다. ※ 아래의 예제 코드들은 전부 여기 에서 확인할 수 있습니다. 예외 상황 재현먼저, 예외가 터지는 상황을 재현해보고 실습해보기 위하여 아래와 같이 코드를 구성해보겠습니다. - ParentServicepackage com.devchw;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org...
사전 준비덤프 파일을 생성할 Mysql 서버가 데이터그립에 연결되어 있어야 합니다mysqldump 파일 사용을 위하여 로컬 환경에 Mysql이 설치되어 있어야 합니다.생성된 덤프파일을 통하여 데이터를 불러올 스키마가 필요합니다.이 본문은 스키마 전체를 Export하고 Import 하는 것을 예제로 사용하였습니다. 따라해보실 경우에 참고해주세요. Export sqldump1. dump 파일을 생성할 스키마 우클릭 > Import/Export > Export with ‘mysqldump’ 2. 덤프 옵션 설정 옵션들이 복잡해보이지만, 하나하나 따져보면 그리 복잡하지 않습니다. 아래의 설명을 보시고 위 각각의 옵션들에 대하여 설명은 다음과 같습니다. `Path to mysqldump` : mysqldump 파..
어느날 Jenkins로 개발 서버에 어플리케이션을 배포하는데, 다음과 같은 에러 문구가 뜨면서 빌드에 실패하였습니다. Gradle build daemon disappered unexpectedly 라는 문구로 구글링을 해본 결과 EC2 메모리가 부족해서 빌드가 실패한 것이라는 이야기가 많아서 개발 서버 EC2 메모리 용량을 free -h 명령어로 확인을 해보니 사용 가능한 메모리가 300MB로 굉장히 작았습니다. 어차피 개발 서버이니 스왑 메모리를 설정을 할까.. 아니면 EC2 메모리 스펙을 늘릴까.. 고민을 하던 와중,왜 갑자기 메모리가 부족하게 되었을까? 라는 근본적인 문제의 원인이 궁금해졌습니다. 먼저 어떤 프로세스가 메모리를 잡아먹고 있는지 알기 위하여, ps -e 명령어를 통하여 모든 프로세스를..