전체 글

전체 글

    [spring] 컴포넌트 스캔

    [spring] 컴포넌트 스캔

    이전까지 스프링 빈 등록할 때 자바 코드의 @Bean이나 XML의 을 통해서 일일이 설정 정보에 직접 등록할 빈을 나열했다. 하지만 지금까지는 등록할 빈이 몇 개 되지 않았기 때문에 문제가 안됐지만 빈의 개수가 늘어나면 직접 등록하는 작업에 부담을 느끼게 된다. 그래서 스프링은 설정 정보 없이 자동으로 스프링 빈 등록을 해주는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존 관계도 자동으로 주입하는 @Autowired 기능도 제공한다. 코드를 통해서 컴포넌트 스캔과 자동 주입에 대해 알아보자. 설명에 앞서 설정 정보가 없어도 자동으로 등록해준다고 했지만 설정 정보를 만든 상태에서 컴포넌트 스캔을 사용하는 코드를 보고 설정 정보가 없는 상태의 코드를 보겠다. @Configuration은 많이 봤던 어노테이션..

    [spring] 싱글톤 레지스트리

    [spring] 싱글톤 레지스트리

    대부분의 스프링 애플리케이션은 웹 애플리케이션이다. 웹 애플리케이션은 여러 클라이언트들이 동시에 요청을 보낸다. 그럴 때마다 객체를 생성하고 소멸되는 과정이 반복되면 메모리 낭비가 심하게 된다. 그래서 스프링에서 스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다. 지금부터 사례로 싱글톤 레지스트리에 대해 알아보도록 하자. 현재 클래스 다이어그램을 보면 Pitcher 클래스와 Catcher 클래스는 Equipment 인터페이스에 의존하고 있다. 그리고 Glove 클래스는 Equipment 인터페이스를 구현한 클래스이다. Pitcher 클래스와 Catcher 클래스는 외부에서 Glove 클래스의 객체..

    [spring] 스프링에서 DI를 하는 이유

    [spring] 스프링에서 DI를 하는 이유

    스프링으로 사용하다 보면 항상 나오는 말이 DI이고 그만큼 강력한 기술이라고 생각한다. 더불어 자바가 객체지향 언어라는 것을 다시금 알 수 있게 해주는 기술이 DI이다. 그래서 이번에는 DI를 사용함으로써 어떤 점이 좋은지 예시를 들어 설명해보려고 한다. 먼저 Player 클래스와 Bat 인터페이스를 만들고 Bat를 구현한 WoodBat 클래스를 추가해준다. 언뜻 보면 Player 클래스는 Bat인터페이스를 의존하고 있고 WoodBat 클래스는 Bat 인터페이스를 구현하여 의존 관계가 잘 성립된 것처럼 보인다. 하지만 Player 클래스를 보면 Bat 인터페이스에도 의존하며 인터페이스를 구현한 WoodBat 클래스에도 의존하고 있는 것을 볼 수 있다. 하지만 배트를 알루미늄 배트로 바꾼다면 인터페이스를 ..

    프로그래머스. 모의고사(JAVA)(완전 탐색)

    프로그래머스. 모의고사(JAVA)(완전 탐색)

    문제 설명 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ... 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ... 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ... 1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작..

    백준 2178. 미로 탐색(JAVA)

    백준 2178. 미로 탐색(JAVA)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int[][] arr; static boolean[][] visit; static int cnt = 0; static int N, M; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamR..

    프로그래머스. 기능개발(JAVA)(스택/큐)

    프로그래머스. 기능개발(JAVA)(스택/큐)

    문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100% 일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발 속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의..

    백준 9372. 상근이의 여행(JAVA)

    백준 9372. 상근이의 여행(JAVA)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int[][] arr; static boolean[] visit; static int T, N, M; static int result; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamR..

    프로그래머스. 더 맵게 (JAVA)(Level 2)

    프로그래머스. 더 맵게 (JAVA)(Level 2)

    ○ 문제 설명 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요. 제한 사항 scov..

    5장 서비스 추상화

    5장 서비스 추상화

    - 사용자 레벨 관리 기능 추가 지금까지 만든 UserDao는 CRUD라고 불리는 가장 기초적인 작업만 가능하다. 이제 여기에 간단한 비즈니즈 로직을 추가해보자. 지금까지 만들었던 UserDao를 다수의 회원이 가입할 수 있는 인터넷 서비스의 사용자 관리 모듈에 적용해보자. 필드 추가 먼저 UserVO 클래스에 사용자의 레벨을 저장할 필드를 추가하자. private static final int BASIC = 1;처럼 숫자 타입을 직접 사용하는 것보다는 자바 5 이상에서 제공하는 이늄enum을 이용하는 게 안전하고 편리하다. 이늄은 아래와 같이 정의한다. 이렇게 만들어진 Level 이늄은 내부에는 DB에 저장할 int 타입의 값을 갖고 있지만, 겉으로는 Level 타입의 오브젝트이기 때문에 안전하게 사용..

    프로그래머스 [카카오 인턴] 키패드 누르기 (Level 1)(JAVA)

    프로그래머스 [카카오 인턴] 키패드 누르기 (Level 1)(JAVA)

    ○ 문제 이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다. 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다. 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가..