@Autowired를 이용해서 조회하면, 이것은 getBean메소드를 이용해서 타입 조회하는것과 유사하게 동작한다. 그런데 선택된 빈이 2개 이상일 경우 getBean메소드와 동일하게 @Autowired도 NoUniqueBeanDefinitionException에러를 발생시킨다. 아래 코드를 보자. @Autowired private DiscountPolicy discountPolicy; //이때 DiscountPolicy메소드를 //RateDiscountPolicy와 FixDiscountPolicy라는 두 개의 클래스가 상속받고 있다고 하자. @Component public class FixDiscountPolicy implements DiscountPolicy() {...} @Component publ..
java에서 static키워드를 사용하면 객체를 생성하지 않고 클래스의 필드와 메서드를 바로 사용할 수 있다. 그래서 객체에 할당될 메모리를 절약하거나, 코드의 길이를 줄일 수 있다. 여기까지는 자바 개념만 배우면서도 알 수 있는 내용이다. 그런데 이번에 웹 프로젝트 코드를 짜면서 '어떤 경우에 static으로 사용하고, 어떤 경우에 인스턴스를 생성해서 사용해야 할지 기준에 대한 명확한 이해가 가지 않았다. 내 머리로는 객체지향적 관점에서 클래스명으로 접근한다는 것은 클래스, 즉 설계적 관점에서 접근한다는 의미이고, 인스턴스로 접근한다면 그 '고유한 객체'만의 속성에 접근한다는 의미이지 않을까? 정도까지만 생각이 가능했다. Human.getAgeAvg(); Human human1 = new Human("..
Ioc (Inversion of Control) 간단하게 말하면, 사용자의 new 선언을 방지하고, 모든 레퍼런스 변수, 관계설정, 제거, 사용까지 오브젝트(스프링 빈) 전반에 걸친 모든 과정을 프레임워크의 컨테이너(스프링 컨테이너)에게 위임하는 것. 이를 통해서 객체는 프레임워크가 관리하고, 사용자가 구현부를 관리함으로서 응집도를 높이고 결합도를 낮추며, 싱글톤 패턴을 유지할 수도 있다. 스프링은 패키지에서 스프링 빈으로 등록된 모든 메소드의 리턴값을 스캔(컴포넌트 스캔)하여 객체들을 관리하고, 의존관계를 주입해준다. 즉 스프링에서 말하는 DI는 객체 합성+객체를 관리할 컨테이너 패턴+IoC를 사용하는 스프링 프레임워크의 특징이라고 할 수 있다. 스프링에서 사용하는 IoC를 DI라고 하며, DI 말고..
EntityManagerFactory emf = Persistence.createEntityManagerFactory("project"); EntityManager em = emf.createEntityManager(); jpa에서 Entitymanagerfactory를 통해서 Entitymanager를 뽑아쓰는것과 다르게, 스프링에서는 스프링부트가 @PersistenceContext어노테이션만 달아주면 바로 EntityManager를 사용할 수 있게 해준다. @PersistenceContext EntityManager em; @Autowired가 스프링 빈을 주입한다면, @PersistenceContext는 영속성 콘텍스트를 주입하는 jpa 어노테이션이다. 이때 @PersistenceContext 대신..
개요 스프링을 이용하는 웹 애플리케이션의 경우 일반적으로 여러 클라이언트의 요청이 동시에 이루어진다. 그런데 싱글톤 방식을 사용하지 않는 컨테이너의 경우 고객의 요청이 올 때마다 객체를 새로 생성해야 한다. 이 대신 객체를 단 1개만 생성하고 공유하도록 하면 자원 낭비를 줄일 수 있다. 싱글톤 패턴 클래스의 인스턴스가 단 한개만 생성되도록 하는 디자인 패턴이다. 결국 한 개의 객체를 공유하도록 만들어 주어야 하는데, 이를 위해서 1. private static final 객체를 1개 생성후 static메서드를 통해서만 조회하게 한다. 2. 생성자는 private로 선언해서 외부에서 new키워드를 사용하지 못하게 한다. 와 같은 방법을 사용할 수 있다. static메서드를 통해서만 조회하도록만을 제한해도,..
프레임워크 vs 라이브러리 내가 작성한 코드를 제어하고, 대신 실행한다면(IoC) 그것은 프레임워크이고, 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리이다.스프링을 사용함으로서 범용의 프레임워크를 이용해서 개발을 진행할 수 있다. 스프링 컨테이너 ApplicationContext를 스프링 컨테이너라고 한다.스프링 컨테이너는 @Configuration 어노테이션이 붙은 AppConfig 전달받아 설정정보로 사용한다. 이때 @Bean이라 명시된 메소드를 모두 호출해서 반환된 객체를 메소드명으로 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.//스프링 컨테이너를 애노테이션 기반의 자바 설정 클래스로 설정ApplicationContext ac = n..
개요 DB에 접근하여 데이터를 수정하려면 쿼리를 DB로 날려주어야 한다. JPA를 사용하면 기본적인 SQL문이 자동으로 나가게 되긴 하지만, 직접 쿼리문을 작성하여 쿼리를 보내야 할 때를 위해 SQL을 추상화하여 만든 객체지향 SQL이 JPQL이다. JPQL은 SQL을 추상화했기 때문에 DB의 종류에 의존적이지 않다는 특징이 있다. (DB에 맞게 변환하는것은 jpa과 hibernate의 몫) 기본 활용법 JPQL의 문법은 SQL과 유사하다. SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN등 SQL 문법을 모두 지원한다. 다만 테이블을 대상으로 쿼리를 작성하는 일반 SQL문과 다르게 JPQL은 jpa의 사용에 맞추어 엔티티 객체를 대상으로 쿼리를 작성할 수 있다. SELE..
Comparable과 Comparator는 둘 다 객체 비교를 위한 인터페이스이다. 따라서 이것들의 사용을 위해서는 인터페이스 내에 선언된 메소드를 반드시 오버라이드 해주어야 한다. 요즘 정리하고 있는 jpa에서의 값 타입에서 컬럼 분리를 위해서 equalsTo 메소드를 오버라이드 해주는 것과 비슷한 맥락인데, 이 비교를 위한 메소드도 자바에서 primitive type 자료형은 값의 비교가 이루어지고, reference type은 참조 비교가 이루어진다는 사실 때문이다. 풀어서 설명하자면, int나 long같은 primitive type의 경우 부등호를 이용하여 간단하게 비교할 수 있다. int a=1; int b=2; System.out.println(a 0반환 3. 작으면 > 양수값 반환 간단하게 ..
JPA에는 엔티티 타입(@Entity로 정의하는 객체)과 값 타입(자바 객체나 primitive type)이 존재한다. 엔티티 타입은 데이터가 변해도 식별자로 추적할 수 있다(엔티티의 값을 변경한다고 해도 식별자를 이용해서 인식할 수 있다). 반대로 값 타입은 단순히 값으로서 사용하는 것으로서 jpa에서 추적하지 않는다. 아래에서는 여러가지 종류의 값 타입에 대해서 알아보겠다. 1. 기본값 타입 - Primitive type - 래퍼 클래스 - String 기본값 타입은 생명주기를 엔티티에 의존한다. 값 타입을 엔티티끼리 공유하게 되면 문제가 발생할 수 있으므로 같은 참조값을 가지면 안된다. (물론 자바의 primitive type같은 경우는 당연히 reference를 공유할 수 조차 없어 안전하다.) ..
그리디(=욕심쟁이, 탐욕) 알고리즘 그리디 알고리즘은 각 단계에서 가장 최선의 선택을 한 후, 선택한 답이 전체적으로도 최선의 방법이기를 '바라는' 알고리즘이다. 최선의 방법이기를 바란다는 말에서 알 수 있듯이 부분적(local)으로만 최선의 해답이고 전역적(global)으로는 최선의 방법이 아닌 경우에 그리디 알고리즘을 적용하게 되면 최선의 해답을 얻을 수 없다. 즉, 그리디 알고리즘을 사용한다고 해서 무조건 최선의 해답을 보장할 수 없다. 따라서 그리디 알고리즘을 사용했을 때 최적의 해답을 주는지가 검증되어야 한다. vs DP 그리디 알고리즘은 동적 프로그래밍과 다르게 지난 선택이나 앞으로의 선택을 고려하지 않는다. 그러므로 탐욕 알고리즘을 적용하려면 앞의 선택이 이후 선택에 영향을 주지 않고 부분적..
https://www.acmicpc.net/problem/2580 2580번: 스도쿠 스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루 www.acmicpc.net 문제 접근 (처음에는 답이 정해진 스도쿠의 경우만 생각해서 1. 행을 검사하여 1개의 0이 존재한다면 정해진 숫자 삽입 2. 열을 검사하여 1개의 0이 존재한다면 정해진 숫자 삽입 3. 3x3크기의 행렬을 검사하여 1개의 0이 존재한다면 정해진 숫자 삽입 과 같이 반복문을 이용하여 삽입하는 코드를 짜고, 왜 이게 백트래킹 문제인지 의아했지만) 출력조건에서 나와있듯이 '스도쿠 판을 채우는 방법이 여..
프록시(Proxy)란? 프록시란, 간단하게 말해 누군가를 대신하여 권한을 받아 수행하는 주체를 말한다. 해당 글에서는 JPA에서 사용되는 프록시 객체에 대한 이야기를 하겠다. 프록시 클래스는 실제 클래스(엔티티)를 상속받아 만들어진다. 따라서 비즈니스 로직에서는 이것이 프록시 객체인지, 실제 엔티티인지 구분없이 사용 가능하다. JPA에서 프록시 패턴의 사용 비지니스 로직이 실행될 때, 어떤 엔티티 객체를 조회하는데 그 엔티티와 관계를 맺고 잇는 다른 엔티티들의 조회도 함께 이루어져야 할 때가 있다. 그런데 그 중에서 한 개의 엔티티만 조회가 이루어져도 상관이 없는 상황에서는 성능상의 손해가 발생할 것이다. 이러한 성능 저하가 발생하지 않게 하기 위하여 '실제 사용되는 시점'에 DB에서 조회하도록..