변화하는 요구사항은 소프트웨어 엔지니어링에서 피할 수 없는 문제. 동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있음. 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미함. => '어떠한 동작을 해라'는 것을 파라미터로 전달하는 것. 하지만 동작 파라미터화를 추가하려면 쓸데없는 코드가 늘어나는데, 이는 자바 8 람다 표현식으로 해결함. 2.1 변화하는 요구사항에 대응하기 2.1.1 첫 번째 시도 : 녹색 사과 필터링 농장의 사과목록에서 녹색 사과만 필터링하는 기능을 추가하는 경우 // 1. 초록 사과를 필터링 하는 메소드 public static List filterGreenApples(List inventory) { List result = new ..
스프링은 AOP안에서 자기 자신의 메서드를 호출하면 AOP가 적용되지 않음. 정말 기본적인 상식?이지만 깜빡하는 경우가 있음. 외부에서 호출해야 해당 @Transactional이 존재하는 빈을 감싼 proxy bean이 호출되어 Transaction이 적용됨. 실제로 적용이 안되는 지 간단한 테스트를 해보자. import jpabook.jpashop.service.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Control..
MyBatis에서 쿼리문 작성 시 보통 #{}을 주로 사용하고, ${} 사용하는 경우는 거의 없었는데, 둘 차이는 무엇이고 어떤 역할인지 알아보도록 하자. #{} -> 바인딩 변수를 이용한 SQL문 처리 시 사용 SELECT * FROM user WHERE id = #{id} 위와 같이 MyBatis 쿼리를 작성할 경우 MyBatis로 하여금 PreparedStatement를 만들어서 PreparedStatement 파라미터에 값을 셋팅하도록 할 것이다. 결과적으로는 아래와 같이 바인드변수를 입력받는 쿼리가 수행될 것이다. 그리고 저 ?에 실제로 수행하려는 파라미터가 입력이 되어진다고 보면 된다. SELECT * FROM user WHERE id = ? 바인드 변수를 이용한 쿼리문이기 때문에 한번 DB에..
MyBatis는 쿼리를 이용해 데이터를 조회 시 매핑되는 객체가 또 다른 객체를 의존하는 형태로 갖고 있는 경우 그 의존하는 객체의 값도 한꺼번에 조회하는 기능을 제공함. (JPA로 치면 fetch join같은 기능?) Association (has one, 일대일 관계) Association은 has one 타입의 관계를 다룰 때 적용 가능함. 예시로 어떤 시험지(Sheet)를 푸는 학생(Stuent)은 한 명인 경우를 객체로 표현하면 아래와 같다. class Sheet { ... Student student; } class Student { int studentId; ... } 위와 같이 시험지와 학생이 일대일 관계를 갖는 경우에 MyBatis의 Association을 이용해서 Sheet 조회 시 S..
JDK Dynamic Proxy & CGLIB Aspect 프레임워크와는 달리 스프링에서는 간단한 설정만으로 JDK Dynamic Proxy와 CGLIB 방식을 사용할 수 있도록 되어 있습니다. 두 방식의 차이는 인터페이스의 유무로서, AOP의 타깃이 되는 클래스가 인터페이스를 구현했다면 JDK Dynamic Proxy를 사용하고, 구현하지 않았다면 CGLIB 방식을 사용합니다. 기본적인 방침은 이러하나 사용자가 어떻게 설정하느냐에 따라서 인터페이스를 구현했다 하더라도 CGLIB방식을 강제하거나 AspectJ를 사용할 수 있습니다. * CGLIB방식을 사용: // proxy-targetclass="true"을 추가하여 CGLIB을 사용하도록 한다. proxy-target-class="true"로 주면 됨..
programmers.co.kr/learn/courses/30/lessons/42747 1. 문제 2. 풀이 import java.util.*; class Solution { public int solution(int[] citations) { int result = 0; // sorting하고 Arrays.sort(citations); for (int i = 0; i = i) { cnt++; } } if (i result) { result = i; } } return result; } } 문제가 어렵다기보다 이해가 잘 안되서 버벅였던 문제. 추가 테스트 케이스를 고려해보자면 { 10, 11, 12, 13 } => 4가 나와야함. 4편 중 4번 이상 인용된 논문이 4편 이상이므로 4가 정답. 처음에 배열..
programmers.co.kr/learn/courses/30/parts/12117 1. 문제 2. 풀이 import java.util.*; class Solution { public int solution(int[] scoville, int K) { int answer = -1; PriorityQueue queue = new PriorityQueue(); for (int i = 0; i 1) { count++; int first = queue.poll(); int second = queue.poll(); queue.add(first + (seco..
programmers.co.kr/learn/courses/30/lessons/42586 1. 문제 2. 풀이 import java.util.*; class Solution { public int[] solution(int[] progresses, int[] speeds) { Stack stack = new Stack(); int prevMaxDay = 0; for (int i = 0; i < progresses.length; i++) { int progress = progresses[i]; int speed = speeds[i]; // j를 0 ~ 99까지 해보면서 for (int j = 0; j < 100; j++) { // 현재 진행률과 속도 * j를 더한 것이 100이 넘으면 if ((progres..
- Total
- Today
- Yesterday
- 비동기
- 스택/큐
- http://www.nextree.co.kr/p6960/
- 프로그래머스
- 논블로킹
- 필터
- a
- 코딩테스트 고득점 Kit
- 블로킹
- Filter
- Synchronous
- Asynchronous
- 동기
- non-blocking
- 프로그래머스 Level 2
- 프로그래머스 Level 3
- 프로그래머스 Level 1
- Handler Interceptor
- 핸들러 인터셉터
- 해시
- 인터셉터
- blocking
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |