글을 쓰게 된 이유 데이터베이스 트랜잭션, MVCC 등 공부를 하면서 lock을 알게 되었는데, lock은 무엇이고, 왜 사용하는지 그리고 어떻게 사용되는지, 어떤 종류가 있는지 알아보겠습니다. 1. Lock이란(이번 글) 2. MySQL InnoDB Lock 의문점 lock을 제대로 공부하기 전에는 lock에서 낙관적 락, 비관적 락이 있다는 것만 알고 있었습니다. 그런데 서칭을 해보니 table lock, gap lock, next-key lock(트랜잭션 격리 수준에서 봄) 등이 존재했습니다. 그러면 이 lock들은 무엇이고, 낙관적 비관적 락은 무엇이며 각각 뭐가 다른 것인지 궁금했습니다. 트랜잭션과 Lock의 용도 트랜잭션을 공부하고 나서 Lock을 공부해보니 둘 다 동시성에 관련 있어서 헷갈렸..
글을 쓰게 된 이유 Java 기초를 더 단단히 다지기 위해서 Java 관련 스터디를 진행하고 있습니다. 그래서 이번 주 주제인 Generic을 공부해 보도록 하겠습니다. Generic은 왜 사용하는 것일까? 타입 안정성 타입 안정성을 보장한다는 것은 무슨 뜻일까요? Java는 많은 타입을 가지게 되는데, 이러한 타입들이 제대로 매칭되지 않으면 ClassCastException이 런타임 시점에 발생하게 됩니다. 아시다시피 제일 힘든 에러는 런타임 에러, 제일 착한 에러는 컴파일 에러라고 하는데 제네릭을 사용하면 ClassCastException을 컴파일 에러 때 잡을 수 있어서 "타입 안정성"을 보장한다고 할 수 있습니다. 먼저 제네릭 사용여부에 따른 예시 코드를 보고 왜 타입 안정성을 보장할 수 있는지 ..
데코레이터 패턴이란? 데코레이터 패턴은 프록시 패턴과 동일하게 ‘프록시’를 사용하는 방법이지만 둘은 그 의도(intent)가 다릅니다. 프록시는 주로 접근 제어를 목적으로, 데코레이터는 새로운 기능 추가가 목적으로 정의됩니다. 즉, 데코레이터 또한 서버와 프록시가 같은 인터페이스를 구현하여 클라이언트는 서버에게 직접적인 요청이 아닌 프록시를 통해 요청을 보냅니다. 그리고 클라이언트 입장에서는 서버에게 요청을 한 것인지, 프록시에게 요청을 한것인지 모르게 되어서 요구 사항 변경 시 클라이언트 코드는 변경되지 않습니다. 그러면 Decorator pattern이 어떻게 생겼는지 코드로 보겠습니다. 상황 예시 데코레이터 패턴은 새로운 기능 추가를 목적으로 사용한다고 했습니다. 그러면 데코레이터 패턴을 쉽게 이해..
콜백 정의 위키에서는 콜백을 다른 코드의 인수로서 넘겨주는 실행 가능한 코드라고 합니다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있습니다. Java에서는 이러한 콜백 코드를 전달할 때 람다나 익명 내부 클래스 형태로 넘겨줍니다. 템플릿 콜백 ? 템플릿 메서드 ? 템플릿 메서드 단일 상속만이 가능한 자바 언어에서 템플릿 메서드를 사용하는데 한계가 있습니다. 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않고, 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합됩니다. 이러한 단점을 해결하기 위해서 상속의 단점을 제거하고 interface를 사용하는 전략 패턴을 DI에 주로 사용합니다. 템플릿 콜백 DI에서 전략 패턴을 주로 사용하는..
글을 쓰게 된 이유 항상 Spring Boot를 실행하면 HikariPool start, shutdown과 같은 로그를 보신 적이 있으실겁니다. 매번 볼 때마다 뭐지? 하며 궁금해했지만, 영한님 DB 강의를 듣다가 hikari가 커넥션 풀 오픈소스 라는 것을 알게 되었고, 더 깊게 공부해보고자 글을 작성하게 됐습니다. Connection pool이 무엇인가요? WAS에선 DB 연결을 위해 Connection을 해야합니다. 하지만 Connection을 하기 위해서는 TCP/IP 통신으로 매 연결마다 많은 리소스를 필요로 하기 때문에 미리 Connection을 가진 객체들을 Connection pool에 보관했다가 연결을 필요로 하면 pool에 있는 Connection 객체를 사용합니다. 그래서 따로 Con..
글을 쓰게 된 이유 프로젝트를 진행하면서 @Column(nullable = false)를 사용하다가 @NotNull은 왜 사용하지 않는걸까? 라는 생각을 했습니다. @NotNull과 @Column(nullable = false)는 언뜻 보기에는 같은 기능을 하는 것처럼 보였습니다. 다만 차이가 있다면 DB layer에서 검증, 애플리케이션 layer에서 검증하는 차이라고 생각했지만 정확하게 어떤 차이가 있는지 알아보고자 다양한 테스트를 통해 확인해봤습니다. dependency implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-star..
글을 쓰게 된 이유 Spring Data JPA를 사용하면서 findById, getById 가 있는 것을 보고 둘은 어떤 차이가 있는지 궁금해서 찾아보았습니다. JpaRepository, CrudRepository 전의 글에서 JpaRepository와 CrudRepository를 비교해보았는데 findById, getById도 연관이 있을 줄은 몰랐습니다,, 아무튼 Spring Data 를 사용하면서 id를 통해 엔티티를 조회하는 메서드가 JpaRepository, CrudRepository에 존재합니다. 하지만 각 메서드의 이름은 다르고, 반환형도 다릅니다. 왜 굳이 메서드 이름과, 반환형을 다르게 했을까요?(아무 이유 없이 그냥 만든 것은 아니라고 생각,,) //CrudRepository Opti..
글을 쓰게 된 이유 스프링을 공부하면서 Java 버전을 설정하는 중에 JRE, JDK 를 보게 되었습니다. 그래서 둘의 차이를 알아보고자 공부하면서 알게 된 내용들을 정리해보았습니다. JDK, JRE JVM + Library Classes(Core API) = JRE JRE + Development Tools = JDK JDK가 무엇인가요? Java Development Kit의 약자로 java 애플리케이션을 개발하는 데 사용되는 소프트웨어 개발 환경입니다. JRE, 인터프리터/로더(Java), 컴파일러(javac), archiver(jar), documentation generator(Javadoc)를 포함하고 있습니다. 즉, 자바 프로그램을 개발할 수 있는 환경을 제공하는 "개발 도구"와 자바 프로그..
쿠키와 세션은 왜 필요할까요? 쿠키와 세션이 필요하다는 것을 알기 위해서는 먼저 HTTP 의 특성을 알아야합니다. HTTP 의 특성 중 statelss라는 무상태성을 가지는데, 이는 상태가 없다는 뜻으로 서버가 클라이언트의 정보를 기억하고 있지 않습니다. 쉽게 말해서 사용자가 로그인을 해서 클라이언트가 "1번 사용자 로그인 했어요" 라고 서버에게 말을 하고 나서, 다음 요청을 보낼 때 클라이언트가 "1번 사용자가 ㅇㅇㅇ 하고 싶어요" 라는 요청을 보낼 때, 서버는 "1번 사용자가 누군데요?" 라는 응답을 보내게 됩니다. 그래서 우리는 요청을 보낼 때마다 로그인을 해야하는 불편함을 가지게 되고, 이를 해결하기 위해 정보를 어딘가에 담을 수 있는 쿠키와 세션을 사용합니다. 쿠키는 무엇인가요? 먼저 쿠키에 대..
Override(Instance Method) super class의 인스턴스 메서드와 동일한 시그니처(이름, 매개변수 형식, 반환 형식)을 가진 sub class의 인스턴스 메서드가 super class의 메서드를 "재정의"하는 것을 말합니다. public class Main { public static void main(String[] args) { System.out.println("=========#1======="); Class1 c1 = new Class1(); c1.doThat(); //Class1 c1.doIt(); //Class1 System.out.println("=========#2======="); Class2 c2 = new Class2(); c2.doThat(); //Class2..
JpaRepository vs CrudRepository JpaRepository는 PagingAndSortingRepository, QueryByExampleExecutor를 상속합니다. PagingAndSortingRepository은 CrudRepository를 상속합니다. public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor { public interface PagingAndSortingRepository extends CrudRepository 상속관계를 보면 JpaRepository는 결국 CrudRepository를 부모로 가지고 있습니다. 그렇다면 패키지 구조를 한번 봐보겠습니다. J..
발단 testcontainers를 공부하면서 unit test, integration test에 관심을 가지게 됐습니다 그래서 나중에 unit test만 실행시키고, integration test만 실행시키는 방법이 없을까해서 구글링을 하다가 찾게 되어 글을 쓰고자 합니다 build.gradle 수정 def test = tasks.named('test') { useJUnitPlatform() { excludeTags "integration" } testLogging { events "PASSED", "FAILED", "SKIPPED" } } def integration = tasks.register("integration", Test) { useJUnitPlatform { includeTags "inte..