스프링의 동시성 문제와 해결 스프링은 기본적으로 빈을 등록할 때, 싱글톤 패턴으로 스프링 컨테이너에 하나의 객체만 가지고 있는 형태를 띄고 있다. 하나의 객체만을 가지고 있기 때문에, 톰캣같은 WAS는 멀티 쓰레드를 지원하기 때문에, 하나의 객체에 여러 클라이언트들이 접근을 하게 되었을 때, 데이터의 변경이 발생한다면 동시성 문제가 발생한다. 동시성 문제란 동시성 문제는 임계 영역에 각기 다른 쓰레드가 동일한 데이터에 접근하고 어떠한 쓰레드가 임계 영역의 데이터를 변경하려고 할 때 발생을 하게 되는데, 임계 영역이란 어떠한 자원을 공유할 수 있는 공간을 말한다. 따라서, 우리가 코드를 사용할 때, 임계영역이 발생할 수 있는 부분은 static 변수를 선언하거나 혹은 싱글톤 패턴으로 인해 새로운 객체의 생..
때때로 스프링 프로젝트에서 테스트 패키지의 테스트 메소드에서 롬복을 사용하려고 하는 경우가 있다. 하지만 main 패키지에서는 잘 되는데 test 패키지에서는 안되는 경우가 종종 발생한다. build.gradle 에 다음과 같은 내용을 추가해주어야 한다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // 아래에 testCompil..
Enum 상수 컬렉션을 정의하는데 사용하는 특수한 자바 유형이다. Enum 클래스로 상수를 정의할 때에는 다음과 같이 정의를 한다. enum Constants { AA, BB, CC, DD } enum에 접근 할 때에는 Constants.AA 와 같이 스태틱 변수에 접근하는 것처럼 접근을 할 수 있고, 각 값에 대해서 ordinal 순서에 대한 값이 생긴다. 어떻게 생기는 것일까? 위에 힌트가 있다. 자세히 살펴보면 Enum 클래스라고 명시를 했는데, 선언을 하는 것을 보니 enum이라고 되어 있다. 사실 enum은 Enum 클래스를 생성하는 특수한 방식이다. Enum 클래스의 생성자를 살펴보면 그 비밀을 알 수 있다. /** * Sole constructor. Programmers cannot invo..
내부 클래스 내부 클래스는 이름 그대로 클래스 안의 클래스이고, 말 그대로 클래스 안에 클래스를 선언하는 것과 같다. 우리는 지금까지 클래스끼리는 격리 시켜서 생성했는데 내부에도 클래스를 생성할 수 있다는 것이다. 다음과 같이 말이다. // 기존의 방식 class A { } class B { } ============= class AA { class BB { } } 위처럼 구성이 되어있을 때 BB를 AA 클래스의 내부 클래스, AA를 BB 클래스의 외부 클래스라고 부른다. 그럼 위와 같은 내부 클래스를 사용하는 이유는 무엇일까? 결론부터 얘기하자면, 캡슐화 및 코드의 복잡성을 줄이는 것이다. 예를 들어서 BB라는 클래스는 AA의 클래스만 사용을 한다고 가정하자. 그럼 BB 클래스는 AA 클래스의 객체를 ..
Generic JDK1.5 부터 도입된 제너릭스는 다양한 타입의 객체를 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주어 타입 안정성을 높이고 형변환의 번거로움을 줄여줄 수 있는 최근에는 꼭 사용해야 할 기능이다. 이제는 공식문서를 볼 때 제너릭스를 알지 못하면 공식문서 분석도 버거울 정도이다. 실제로도 이러한 문제를 몸소 겪어서, 이번에 제너릭스에 대해 한 번 자세히 들여다보았습니다. 제너릭스는 다음과 같이 선언이 가능하다. class Box { T item; void setItem(T item) { this.item = item; } } 기존의 보던 클래스와 다른 점을 살펴보면 제너릭 타입변수 T가 생긴 것을 볼 수 있다. 여기서 한 가지 의문을 가질 수 있는 경우는 T의 의미인데 f(x..
반복문 반복문에는 for문, while문, while문의 변형인 do-while문이 있다. for문 while문과 do-while문의 가장 큰 차이는 for문이나, while문에 속한 문장은 조건에 따라 한 번도 수행되지 않을 수 있지만, do-while문은 do-while에 속한 문장은 무조건 최소한 한 번은 수행될 것이 보장된다. for문 for문은 반복 횟수를 알고 싶을 때 적합하다. for(초기화;조건식;증감식;) { // 조건식이 참일 때 수행될 문장들을 적는다. } == for(int i = 1; i
1. 조건문 - if, switch 조건문은 조건식과 문장을 포함하는 블럭{}으로 구성되어 있고, 조건식의 연산관계에 따라 실행할 문장이 달라져서 프로그램의 실행 흐름을 변경할 수 있다. → Jump 즉, 인터럽트랑 같은 부분이다. if문 만일(if) 조건식이 참(true)면 {} 안의 문장을 실행해라. 라는 의미로 수행된다. if (조건식) { // 조건식이 true 일 때 수행될 문장들을 적는다. } if (score > 60) { System.out.println("합격입니다."); } 조건식 조건식은 일반적으로 비교연산자와 논리연산자로 구성된다. // 1. if(90 60) { System.out.println("합격입니다."); } 블럭 내의 문장이 하나뿐인 경우, { } 를 생략할 수 있지만,..
다형성 객체지향언어에서 제일 중요한 다형성이다. 다형성을 이해해야 앞으로 나올 객체지향 특징 중 하나인 추상화에 대해서, 그 추상화와 관련된 abstract와 interface에 대해서도 이해할 수 있다. 따라서 다형성을 꼭 이해하고 넘어가야 한다. 먼저 다형성의 정의를 원론적인 의미에서 살펴보자면 다형성은 여러 가지 형태를 가질 수 있는 능력이다. 그러나 이건 원론적인 의미이고, 실제로 다형성을 객체지향언어에 관점에서 보자면 다음과 같이 답해야 한다. 부모의 참조 타입 변수로 자식의 참조 타입 객체를 다루는 것. 여기서 그냥 넘어갈 수도 있지만 눈여겨 봐야 하는 것은 부모의 참조 타입 변수로 자식의 참조 타입 객체를 다루는 것이다. 즉 결론적으로 자식 타입의 객체를 다루는 것이다. 이 말에 초점을 두고..