전체 글

전체 글

    [AWS] EC2 인스턴스 초기 설정

    [AWS] EC2 인스턴스 초기 설정 아마존 리눅스 인스턴스를 생성 완료했다면, ec2 접속 후 몇 가지 초기 설정을 하자 Java 8 설치 자바가 설치 되어있는지 먼저 확인해보자 java -version 자바 7이 설치되어있을 수도, 아무 설치가 안되어있을 수도 있다. 우선 둘다 상관없이 자바 8을 설치한다. sudo yum install -y java-1.8.0-openjdk-devel.x86_64 자바 설치가 안되어있었으면 완료가 되었고, 만약 자바 7이 기존에 설치되어있었다면 버전 변경 과정이 필요하다. sudo /usr/sbin/alternatives --config java 다음 명령어를 실행 시, 두 가지 버전을 선택할 수 있는 창이 뜰 것이다. 여기서 jre-1.8.0버전에 해당하는 번호를..

    [IntelliJ] JUnit Test 메소드 명 한글 깨짐 해결

    테스트를 수행하다가 메소드명이 깨져서 나오는 경우가 있다. 기본적인 인코딩 설정 (설치 폴더 경로의 .vmoptions 수정, settings의 File Encodings)을 다 완료해도 메소드명은 그대로 깨져있을 수 있다. 기본 인코딩 설정에 관련하여 설명되어있는 블로그 링크 위의 방법으로 웬만해서는 해결이 될 것이다. 하지만 아직도 한글이 깨져있다면 아래 방법을 적용하면 해결된다. 방법은 인텔리제이의 도구창에서 Help → Edit Custom VM Options에 들어간다. 위에 나온 기본 인코딩 설정에서 설치 폴더의 idea64.exe.vmoptions를 수정했지만, 현재 프로젝트 폴더 자체가 사용자\AppData\Roaming에 있는 JetBrain으로 잡혀있어 수정된 파일이 적용이 되지 않은 ..

    [Git] .gitignore이 제대로 작동하지 않는 경우

    프로젝트를 Git에 올릴 때, 불필요한 정보(.idea, .gradle, build/ 등)나 보안이 필요한 파일들은 .gitignore에 정리한다. 하지만 분명히 작성을 했는데도, git add . 후 git status를 확인했을 때 change 파일 명단에 올라가있는 경우가 있다. 이때는 캐시(cache)에 문제가 있는 것이므로, 캐시를 삭제한 뒤 다시 진행해야 한다. git rm -r --cached . git add . git commit -m "fixed project"

    [Spring Data JPA] 더티 체킹 (Dirty Checking)

    [Spring Data JPA] 더티 체킹 (Dirty Checking) 트랜잭션 안에서 Entity의 변경이 일어났을 때 변경한 내용을 자동으로 DB에 반영하는 것 ORM 구현체 개발 시 더티 체킹이라는 말을 자주 볼 수 있다. 더티 체킹이 어떤 것을 뜻하는 지 간단히 살펴보자. JPA로 개발하는 경우 구현한 한 가지 기능을 예로 들어보자 ex) 주문 취소 기능 @Transactional public void cancelOrder(Long orderId) { //주문 엔티티 조회 Order order = orderRepository.findOne(orderId); //주문 취소 order.cancel(); } orderId를 통해 주문을 취소하는 메소드다. 데이터베이스에 반영하기 위해선, update와..

    다익스트라(Dijkstra) 알고리즘

    다익스트라(Dijkstra) 알고리즘 DP를 활용한 최단 경로 탐색 알고리즘 다익스트라 알고리즘은 특정한 정점에서 다른 모든 정점으로 가는 최단 경로를 기록한다. 여기서 DP가 적용되는 이유는, 굳이 한 번 최단 거리를 구한 곳은 다시 구할 필요가 없기 때문이다. 이를 활용해 정점에서 정점까지 간선을 따라 이동할 때 최단 거리를 효율적으로 구할 수 있다. 다익스트라를 구현하기 위해 두 가지를 저장해야 한다. 해당 정점까지의 최단 거리를 저장 정점을 방문했는 지 저장 시작 정점으로부터 정점들의 최단 거리를 저장하는 배열과, 방문 여부를 저장하는 것이다. 다익스트라의 알고리즘 순서는 아래와 같다. 최단 거리 값은 무한대 값으로 초기화한다. for(int i = 1; i

    [Spring Boot] Test Code

    [Spring Boot] Test Code 테스트 코드를 작성해야 하는 이유 개발단계 초기에 문제를 발견할 수 있음 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 시 기존 기능이 잘 작동하는 지 확인 가능함 기능에 대한 불확실성 감소 개발 코드 이외에 테스트 코드를 작성하는 일은 개발 시간이 늘어날 것이라고 생각할 수 있다. 하지만 내 코드에 오류가 있는 지 검증할 때, 테스트 코드를 작성하지 않고 진행한다면 더 시간 소모가 클 것이다. 1. 코드를 작성한 뒤 프로그램을 실행하여 서버를 킨다. 2. API 프로그램(ex. Postman)으로 HTTP 요청 후 결과를 Print로 찍어서 확인한다. 3. 결과가 예상과 다르면, 다시 프로그램을 종료한 뒤 코드를 수정하고 반복한다. 위와 같은 방식이 얼마나..

    [Spring Boot] SpringApplication

    스프링 부트로 프로젝트를 실행할 때 Application 클래스를 만든다. 클래스명은 개발자가 프로젝트에 맞게 설정할 수 있지만, 큰 틀은 아래와 같다. @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @SpringBootApplication 어노테이션을 통해 스프링 Bean을 읽어와 자동으로 생성해준다. 이 어노테이션이 있는 파일 위치부터 설정들을 읽어가므로, 반드시 프로젝트의 최상단에 만들어야 한다. SpringApplication.run()으로 해당 클래스를 run하면, 내장 WAS를 실행한다...

    Blocking/Non-blocking & Synchronous/Asynchronous

    Blocking/Non-blocking & Synchronous/Asynchronous 동기/비동기는 우리가 일상 생활에서 많이 들을 수 있는 말이다. Blocking과 Synchronous, 그리고 Non-blocking과 Asysnchronous를 서로 같은 개념이라고 착각하기 쉽다. 각자 어떤 의미를 가지는지 간단하게 살펴보자 homoefficio님 블로그에 나온 2대2 매트릭스로 잘 정리된 사진이다. 이 사진만 보고 모두 이해가 된다면, 차이점에 대해 잘 알고 있는 것이다. Blocking/Non-blocking 블럭/논블럭은 간단히 말해서 호출된 함수가 호출한 함수에게 제어권을 건네주는 유무의 차이라고 볼 수 있다. 함수 A, B가 있고, A 안에서 B를 호출했다고 가정해보자. 이때 호출한 함수..

    [Spring] MVC Framework

    Spring MVC Framework 스프링 MVC 프레임워크가 동작하는 원리를 이해하고 있어야 한다 클라이언트가 서버에게 url을 통해 요청할 때 일어나는 스프링 프레임워크의 동작을 그림으로 표현한 것이다. MVC 진행 과정 클라이언트가 url을 요청하면, 웹 브라우저에서 스프링으로 request가 보내진다. Dispatcher Servlet이 request를 받으면, Handler Mapping을 통해 해당 url을 담당하는 Controller를 탐색 후 찾아낸다. 찾아낸 Controller로 request를 보내주고, 보내주기 위해 필요한 Model을 구성한다. Model에서는 페이지 처리에 필요한 정보들을 Database에 접근하여 쿼리문을 통해 가져온다. 데이터를 통해 얻은 Model 정보를 C..

    [Java] 직렬화(Serialization)

    [Java] 직렬화(Serialization) 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술 각자 PC의 OS마다 서로 다른 가상 메모리 주소 공간을 갖기 때문에, Reference Type의 데이터들은 인스턴스를 전달 할 수 없다. 따라서, 이런 문제를 해결하기 위해선 주소값이 아닌 Byte 형태로 직렬화된 객체 데이터를 전달해야 한다. 직렬화된 데이터들은 모두 Primitive Type(기본형)이 되고, 이는 파일 저장이나 네트워크 전송 시 파싱이 가능한 유의미한 데이터가 된다. 따라서, 전송 및 저장이 가능한 데이터로 만들어주는 것이 바로 '직렬화(Serialization)'이라고 말할 수 있다. 직렬화 조..