[공부 노트] #1

2 minute read

Q1. 하이버네이트(hibernate)

하이버네이트는 JPA의 구현체 중 하나이다. JPA는 영속성 관리, ORM 을 위한 표준 인터페이스로, 이 중 ORM을 위한 구현체가 OpenJPA, EclipseLink, TopLink Essentials, 그리고 Hibernate 등이 있다. ORM(Object-relational mapping)은 객체와 관계형 데이터베이스를 매핑해주는 역할을 한다. 이를 사용함으로써 개발자는 쿼리보다는 객체에 집중하여 개발할 수 있어 재사용 및 유지보수가 용이하고 DB에 대한 종속성을 줄일 수 있지만, 프로젝트와 쿼리문이 복잡해지면 ORM사용에 대한 난이도가 급증하고 이때 구현에 따른 성능저하가 발생하기 쉽다고 한다.(결국 잘 쓰면 좋다는 뻔한 얘기)

Q2. 싱글톤(Singleton)패턴

어플리케이션이 시작할 때, 어떤 클래스가 최초로 한번만 메모리를 할당하고, 해당 메모리에 인스턴스를 만들어 사용하는 것 이다. 즉, 단 하나의 인스턴스만 생성하여 사용하는 디자인 패턴으로, 생성자를 여러번 호출하더라도 하나의 객체만 리턴하게 된다. 하나의 인스턴스만 사용한다는 점에서 메모리가 절약되고, 인스턴스의 유일성을 보장할 수 있으며, 다른 객체가 공유하기 쉽다. 하지만 프로그램 전반에서 하나의 인스턴스를 사용하기 때문에 객체간의 결합도가 높아진다.(싱글톤 객체가 변경되면 줄줄이 변경해야함)

Q3. DI(Dependency Injection)

스프링 프로젝트를 무작정 진행하는 과정에서 @Autowired라는 annotation이 헷갈렸다. 그래서 자동으로 연결하는 것이 왜 의존성을 주입하는 것을 의미하는지 개념을 찾아보고, DI에 대한 개념을 복습해보기로 했다.

의존성을 예시를 통해 이해해보자.

public class Owner {
    private Animal animal = new Animal();
}

위와 같은 코드에서 Owner클래스를 사용하려면 필연적으로 Animal클래스를 사용할 수 밖에 없고, 이러한 상황을 Owner클래스가 Animal클래스에 의존적이다(의존성을 가진다)라고 한다. 의존하게 되었다는 부분에서 두 클래스 사이의 결합도가 높아지게 되었고, 이는 향후 유지보수 및 테스트를 어렵게 만드는 요인이 된다. 이를 해결하기위해 IoC의 일종인 DI를 이용하여 직접적으로 의존성을 만들지 않고, 외부에서 가져오는 것이다. 이 DI를 구현하기위한 방법으로는 다음과 같은 3가지 방법이 있다.

1) 생성자 이용

public class Owner {
    private Animal animal = new Animal();

    public Owner(Animal animal) {
		this.animal = animal
	}
}

2) 필드이용

public class Owner {
    @Autowired
    private Animal animal = new Animal();
}

3) setter 메소드

public class Owner {
    private Animal animal = new Animal();

    public setAnimal(Animal animal) {
		this.animal = animal
	}
}

생성자를 이용하는 방법에서는 스프링4.3 이상부터 @Autowired 어노테이션이 생략 가능해졌다고 한다. 그리고 이 3가지 방법 중 생성자를 이용하는 방식이 가장 권장된다고 한다. 그 이유는 반드시 사용하는 객체와 의존성없이는 인스턴스를 생성하지 못하도록 강제할 수 있기 때문이라고 한다.

Q4. Bean

Java Bean / Spring Bean

Java Bean은 데이터를 표현하는 것이 목적인 클래스를 의미하며, 다음과 같은 규약이있다.

  1. 기본생성자가 존재해야한다.
  2. 모든 멤버변수의 접근제어자는 private이다.
  3. 멤버변수마다 getter/setter가 존재해야한다. (속성이 boolean일 경우 is를 붙힘)
  4. 외부에서 멤버변수에 접근하기 위해서는 메소드로만 접근할 수 있다.
  5. Serializable(직렬화)가 가능해야한다.

당연히 이름이 같아서 Spring에서 쓰는 Bean 객체로 이해해버렸지만, 놀랍게도 정의가 아예 달랐다. Spring에서의 bean은 IoC컨테이너에 의해 관리되는 객체로, 별다른 규약은 없다.
이것을 왜 쓰는지, 어떻게 쓰는지에 대한 궁금증을 완벽하게 정리한 블로그를 발견하여, 링크로 정리를 대신하기로 했다. 정말 너무 잘 정리되어있어서, 내가 다시 정리하더라도 결국 똑같이 보고 따라서 정리하게 될 것 같다는 생각이 들었기 때문이다. 쉬운 설명과 적절한 예제로 이해를 돕는 부분이 배울만하다는 생각이 들 정도이다.

일주일이 지나간다

본격적으로 배운 내용이나 궁금한 내용을 포스팅하게 된 첫 주이다. 남의 블로그 정리글이나 읽을 줄 알았지, 막상 적으려니 굉장히 어려웠다. 내가 배운 것을 정리하려는 것이 주된 목적임에도, 혹시나 누가 볼지도 모른다는 생각에 자꾸 많은 부분들이 신경쓰이게 되는 것 같다. 너무 잘 정리하려는 강박에서 벗어나서, 궁금한 부분을 깔끔하게 이해한 뒤 최대한 짧은 글로 정리하려는 노력이 필요할 것 같다. 정말 정리가 필요한 개념은 따로 포스트를 빼내고, 간결한 설명 위주로 공부 노트를 채워나가야겠다.

Leave a comment