1. 학습 목표Synchronized를 ReentrantLock으로 최적화해보자2. 학습 내용ReentrantLockSynchronized 와 ReentrantLock 의 가장 큰 차이점은 Lock을 걸어주고 풀어주는 시점을 직접 조작함으로써 좀더 세밀한 조작이 가능하다는 점이다.Synchronized 은 자동 잠금해제에 속하고, ReentrantLock 은 명시적 잠금해제가 필요하다.ReentrantLock 은 tryLock() 같은 다양한 메서드를 지원하는데 이는 고성능의 동시성제어가 필요한 상황에서 더 유리하게 작용한다.그런 저번에 작성한 코드를 ReentrantLock으로 최적화해보자. lock.unlock(); try { // 과목의 현재 수강신청 인원 카운터 가져오기 (없으면 새로 생성..
1. 학습 목표synchronized 를 사용해 수강신청 로직 작성작업 큐를 생성해 Task 관리2. 학습 내용Controller Layer우선 memberEmail과 subjectName 을 받아오는 DTO를 정의했고 이를 전달하는 Controller 작성package study.threadsynchronized.registration;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import lombok.RequiredArgsCo..
1. 학습 목표synchronized, reentrantlock 개념 숙지동시성 문제를 해결하기 위한 예시코드 작성2. 학습 내용synchronized멀티 스레드의 큰 장점으로는 자원의 공유가 있다. 하지만 해당 자원을 여러게의 쓰레드에서 접근하게 되면 반드시 안정성과 신뢰성에 문제가 발생할것.안좋은 예시 코드는 다음과 같다. private int counter = 0; // 공유자원 @Test public void testThreadSafety() throws InterruptedException { int numberOfThreads = 100; CountDownLatch countDownLatch = new CountDownLatch(numberOfThreads); // Thread 선언 In..
람다표현식 이란 동작파라미터화와 세트로 코드를 보다 간결하고 보기 좋게 만들어준다.표현식은 익명 클래스와 유사하지만 훨씬 깔끔함3.1 람다란 무엇인가?람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것.람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환형식, 발생할 수 있는 예외 리스트를 가질 수 있다.익명보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 구현해야 할 코드에 대한 걱정거리가 줄어든다.함수람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다.전달람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다.간결성익명 클래스처럼 많은 자질구레한 코드를 구현할 필요..
동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응 가능동작 파라미터화란 하직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미 (filter 개념으로 이해하면 될듯)예를 들어 컬렉션을 처리할 때 다음과 같은 메서드를 구현한다고 가정하자리스트의 모든 요소에 대해서 ‘어떤 동작’을 수행할 수 있음 리스트 관련 작업을 끝낸 다음에 ‘어떤 다른 동작’을 수행할 수 있음 에러가 발생하면 ‘정해진 어떤 다른 동작’을 수행할 수 있음동적 파라미터화는 ‘특정 상황’에 ‘특정 행동’이 필요한 경우내부 객체로를 처리 불가능 한 경우 (해당 동작 책임을 가진 객체가 없는 경우)‘특정 상황’이 존재하지 않는다면 파라미터화 하지 않고 처리하는 것이 좋아보임내가 이해하기로는 약간 레고를 쌓는것처럼 동작 하나..
1.1 역사의 흐름은 무엇인가?자바 1.0에서는 스레드와 락, 심지어 메모리 모델까지 지원했다.아마 단일 코어 환경에서 최선의 퍼포먼스를 뽑아내기 위한 선택이였던 것으로 추측하지만 상당히 저수준의 기능을 온전히 활용하기는 어려웠다.자바 5에서는 스레드풀, 병렬 실행 컬렉션 등 아주 강력한 도구를 도입했다.자바 7에서는 병렬 실행에 도움을 줄 수 있는 포크/조인 프레임워크를 제공했지만 여전히 어려움스레드풀자바의 스레드풀(Thread Pool)은 작업을 처리하기 위해 미리 생성된 스레드들의 집합입니다. 이를 통해 새로운 스레드를 생성하는 오버헤드를 줄이고, 리소스를 효율적으로 관리하며, 애플리케이션의 성능을 향상시킬 수 있습니다. 스레드풀을 사용하면 일정 수의 스레드가 재사용되며, 작업 큐에 있는 작업을 순..
@Transactional(readOnly = true) public List findReviewsByMemberEmail(String memberEmail) { List reviews = reviewRepository.findReviewsByMemberEmail(memberEmail); return reviews.stream() .map(ResponseReviewDto::toDto) .sorted(Comparator.comparing(ResponseReviewDto::getReviewSeq) .reversed()) .collect(Collectors.toList()); } 다음과 같이 수정하면 된다. 여기서 .map(ResponseReviewDto::toDto) 까지는 자주 사용하는 람다식이지만 그 밑..
다형성 추상클래스 package oop.polymorphism; /* * 추상클래스 * => 상위클래스의 역할을 하는 클래스 * => 객체를 생성할 수 없는 클래스(미완성된 클래스) * => 내용이 구현되어 있지 않은 메소드를 포함하고 있는 클래스를 추상 클래스라 한다. * ----------------------- * 추상 메소드(body가 없는 메소드) * 1) 추상 메소드를 선언하는 방법 * 접근제어자 abstract 리턴타입 메소드명 (매개변수1, 매개변수2....); * 2) 추상클래스의 특징 * - 추상메소드가 하나라도 정의되어 있으면 추상클래스가 된다. 추상클래스는 선언부에 abstract을 추가한다. * - 추상 클래스에는 추상 메소드와 일반 메소드를 모두 정의할 수 있다. * - 추상 클..
스프링 컨테이너 생성 스프링 컨테이너가 생성되는 과정을 알아보자. // 스프링 컨테이너에 AppConfig를 등록한다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); ApplicationContext를 스프링 컨테이너라 한다. ApplicationContext는 인터페이스이고 해당 코드를 보면 알 수 있듯 다형성이 적용되어 있다. 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 에노테이션 기반의 자바 설정 클래스로도 만들 수 있다. (요즘엔 XML은 잘 사용하지 않는 추세다) 직전에 AppConfig를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만..
for문같은 반복문 안에서 메소드를 호출하면 호출 될때마다 힙 메모리에 해당 메소드가 호출되어 메모리를 더 많이 쓰게된다. 계속 바뀌는 값이면 어쩔 수 없지만 바뀌지 않는 고정된 값이라면 반복문에 들어가기 전 변수에 해당 값을 할당한 뒤 반복문을 돌려주는게 더 효율적이다. Instance member stack과 heap 영역에 할당된다. 인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말한다. 클래스 멤버는 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없다. 객체가 가지고 있는 고유의 값이라고 생각하면 될 것 같다. Static member method 영역에 할당된다. static(정적) 멤버란 클래스의 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 ..