목록전체 글 (33)
기록하자..
I/O 학습할 것 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream과 OutputStream Byte와 Character 스트림 표준 스트림 (System.in, System.out, System.err) 파일 읽고 쓰기 입출력 프로그램에서 데이터를 읽고 쓰는 작업이 빈번히 일어난다. 데이터는 사용자로부터 외부장치를 통해 입력받을 수 있고, 파일 또는 네트워크로부터 입력될 수도 있다. 반대도 마찬가지이다. 자바에서 데이터는 스트림을 통해 입출력된다. 스트림 (Stream) Stream은 단일 방향으로 연속적으로 흐르는 것을 말한다. 데이터가 출발지에서 나와 도착지로 흐른다는 개념으로 이해하면 좋다. 프로그램이 출발지냐 도착지냐에 따라 스트림의 ..
애노테이션 학습할 것 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 애노테이션이란? 애노테이션은 메타데이터로 볼 수 있다. 메타데이터는 애플리케이션이 처리해야 할 데이터가 아니라 컴파일 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다. 애노테이션은 세 가지 용도로 사용된다. 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공 런타임 시간에 특정 기능을 실행하도록 정보를 제공 애노테이션은 코드에 넣는 주석이기 때문에 실행되는 것이 아니라고 생각해야 한다. 애노테이션에 동적으로 실행되는 코드는 들어가지 않는다. 애노테이션 정의하는 방법 애노테이션을 정..
Enum 학습할 것 enum 정의하는 방법 enum이 제공하는 메소드 (values()와 valueOf()) java.lang.Enum EnumSet Enum 이란? Enum은 서로 관련된 상수를 편리하게 선언하기 위한 것이다. Enum을 통해 변수를 미리 정의된 상수가 될 수 있도록 해준다. Enum 정의하는 방법 Enum을 정의하는 방법을 알아보자. enum 열거형 이름 {상수명1, 상수명2, ...} enum Direction { EAST, WEST, SOUTH, NORTH } 위와 같이 간단하게 {} 안에 상수의 이름을 나열하면 된다. 위와 같이 Enum을 선언했다면 이제 해당 타입을 사용할 수 있다. Direction curDir; Direction prevDir; Direction curDir..
문제 다음과 같은 Payment 엔티티가 있다. 회원의 결제 목록을 조회하기 위해서 Payment와 Member를 fetch join해서 한 번에 가져오려는 시도를 하고 있었다. @Query(value = "select p from Payment p join fetch p.member m join fetch p.ticket t where m.email = :email", countQuery = "select count(p) from Payment p") List findByEmail(@Param("email") String email, Pageable pageable); 사용자의 email이 일치하는 경우의 결제 목록을 가져오고 싶어 다음과 같은 쿼리를 작성했다. 이렇게 쿼리를 날리게 되면 다음과 같은 ..
혼자서 프로젝트를 진행하던 중 사용자의 로그인 이후 요청마다 사용자의 검증을 위해 어떤 기술을 사용할까 고민하던 중 Session 대신 JWT를 선택했다. 이유를 설명하기 위해서 먼저 HTTP의 특성을 먼저 얘기하고자 한다. HTTP - Stateless HTTP는 클라이언트-서버 구조를 따르는 프로토콜이다. 클라이언트가 서버에 요청을 보내고, 응답을 대기하면 서버가 요청에 대한 결과를 만들어서 응답하는 구조이다. HTTP 또다른 특징은 무상태 프로토콜이라는 것이다. 이는 서버가 클라이언트의 상태를 보존하지 않는다는 말이다. HTTP는 서버가 클라이언트의 요청을 처리하면 연결을 끊어 클라이언트에 대한 이전 정보를 가지고 있지 않게 된다. 이 방식은 서버의 확장성(Scale-out)을 높일 수 있고 불필요..
프로젝트를 진행하면서 JWT 토큰 인증 방식을 통해 로그인을 구현하던 중에 Refresh 토큰을 저장할 저장소를 만들어야(?) 하는 시점이 왔다. 처음에는 DB에 저장했었는데.. 이는 저장소의 I/O 작업이 발생해서 성능상 좋지 않다고 생각했다. 그래서 캐시 방식으로 동작하는 인메모리 저장소인 Redis와 Memcached 를 알게 되었는데, 이중 어느 것을 선택해야 할까? 먼저 Redis 란? Redis는 Remote Dictionary Server의 약자이다. 말 그대로, 외부 Dictionary 형태를 가진 서버이다. dictionary는 파이썬의 dictionary 형태를 생각하면 이해하기 쉬울 것 같은데, Key-Value 형태의 자료를 외부 서버에 저장하는 것이다. Memcached 는? Re..
멀티 쓰레드 프로그래밍 학습할 것 Thread 클래스와 Runnable 인터페이스 쓰레드의 상태 쓰레드의 우선순위 Main 쓰레드 동기화 데드락 Process와 Thread 프로세스 프로세스란 간단히 말해 실행 중인 프로그램을 말한다. 좀 더 자세히 말해보면, 사용자가 작성한 프로그램이 운영체제로부터 메모리를 할당받아 실행 중인 것을 말한다. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리등의 자원, 쓰레드로 구성되어 있다. 쓰레드 프로세스의 자원을 이용해서 프로세스 내에서 실제로 작업을 수행하는 주체이다. 모든 프로세스에는 1개 이상의 쓰레드가 존재하여 작업을 수행할 수 있다. Thread 클래스와 Runnable 인터페이스 쓰레드를 생성할 수 있는 방법은 크게 두 가지가 있다. Thread 클..
예외 처리 학습할 것 자바에서 예외 처리 방법 (try, catch, throw, throws, finally) 자바가 제공하는 예외 계층 구조 Exception과 Error의 차이는? RuntimeException과 RE가 아닌 것의 차이는? 커스텀한 예외 만드는 방법 Exception과 Error의 차이는? Exception과 Error 모두 Throwable 클래스의 하위 클래스이다. 에러는 JVM 실행에 문제가 생겼다는 것이다. 보통 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 말한다. 개발자는 이런 에러에 대처할 방법이 없다. 예외는 예외가 발생하면 프로그램이 종료되는 것은 에러와 동일하지만, 개발자가 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태를 ..