[TIL] Udemy 18일차 프론트엔드/백엔드 - Java 기초

강준호·2024년 1월 9일

Udemy

목록 보기
22/44

스프링 핵심원리 - 기본편[8] 빈 생명주기 콜백

https://velog.io/@mpfo0106/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B88-%EB%B9%88-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0-%EC%BD%9C%EB%B0%B1

스프링 핵심원리 - 기본편[9] 빈 스코프

https://velog.io/@mpfo0106/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B89-%EB%B9%88-%EC%8A%A4%EC%BD%94%ED%94%84

팀스터디

싱글톤 패턴에 대해 예시를 들어서 설명해주세요.

  • 카페 쿠폰 도장 비유

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.

  • 단 하나의 유일한 객체를 만들기 위한!

  • 전역변수와 비슷하다고 생각하면 된다.

왜 사용할까?

  • 메모리 절약을 위해서.
  • 똑같은 인스턴스를 새로 만들지 않고 기존 인스턴스를 재활용한다!
  • 그 객체가 리소스를 많이 차지하는 역할을 하는 무거운 클래스일수록 아주 적합하다.

예시

  • 데이터베이스 연결 모듈.
    I/O 작업은 매우 무거운 작업이라 한번만 객체를 생성하고 돌려쓰는게 현명

적용 코드

package hello.core.singleton;

public class SingletonService {
   
    //1. static 영역에 객체를 딱 1개만 생성해둔다.
    private static final SingletonService instance = new SingletonService();

    //2. public으로 열어서 객체 인스턴스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다.
    public static SingletonService getInstance() {
        return instance;
    }

    //3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다. 
    private SingletonService() {
    }

    public void logic() {
        System.out.println("싱글톤 객체 로직 호출");
    }
}

딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는 것을 막는다!!

  • 객체의 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율 적으로 사용!

싱글톤 패턴 문제점

의존성이 높아진다.

  • 의존관계상 클라이언트가 구체 클래스에 의존한다.
  • new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는 SOLID 원칙 중 DIP(의존성 역전 원칙)를 위반하게 되고 OCP(개방-폐쇄) 원칙 또한 위반할 가능성이 높다.

의존성이 높아진다, OCP(개방 폐쇄 원칙) 원칙을 위반할 가능성이 높다.

  • 싱글톤 패턴을 사용하는 경우 클래스의 객체를 미리 생성한 뒤에 필요한 경우 정적 메서드를 이용하기 대문에 클래스 사이에 의존성이 높아지게 된다는 문제점이 있다. (= 높은 결합)

테스트하기 어렵다.

  • 단위테스트는 서로 독립적이여야 하는데, 자원을 공유하기 때문
  • private 생성자로 번거로움

결론적으로 유연성이 떨어진다.

해결방안

싱글톤 컨테이너

  • 스프링의 기본 빈 등록 방식: 싱글톤
  • 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다.

  • 스프링 컨테이너 덕분에 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다.

싱글톤 방식의 주의점! (자주 발생)

여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하 게 설계하면 안된다.

  • 모두 다 같이 쓰는거기 때문에 가급적 읽기만 가능하게 깨끗히 써야해.

  • 특정 클라이언트에 의존적인 필드가 있으면 안된다.

필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다.

  • 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!!

  • EX) 같은 객체를 사용하다보니 공유 필드를 쓰면 만원 결제 한게 2만원으로 찍힌다던가하는 문제가 발생할 수도 있다.

문제가 터지는 코드

package hello.core.singleton;

public class StatefulService {

    private int price; //상태를 유지하는 필드

    public void order(String name, int price) {
        System.out.println("name = " + name + " price= " + price);
        this.price = price; //여기가 문제!
    }

    public int getPrice(){
        return price;
    }
}

지역변수를 사용함으로서 해결

package hello.core.singleton;

public class StatefulService {

//    private int price;

    public int order(String name, int price) {
        System.out.println("name = " + name + " price= " + price);
//        this.price = price;
        return price;
    }

//    public int getPrice(){
//        return price;
//    }
}

멘토링 QnA

Q. 자소서를 쓸 때 지원동기를 적는 문항이 가장 어려웠습니다. 그리고 면접을 보는 경험이 힘들고 긴장되었던 것 같습니다. 그래서 다음과 같은 질문 드립니다.

질문내용:
1. 멘토님께서 지원서를 확인하실 때 가장 인상 깊었던 지원동기나 멘토님께서 생각하시는 지원동기의 올바른 방향성이 궁금합니다.
2. 멘토님께서도 이직을 하시면서 면접을 보신 경험이 있으실 것 같습니다. 본인만의 면접 준비 방법이나 꿀팁이 있는지 궁금합니다.

  • 해당기업의 도메인이라던가 연관지어서 설명해야해. 지원하고 싶은 부서와서 그 경쟁력과 매칭시키는게 좋아.

  • 자주 이야기하는게 근거기반의 사고가 아주 중요하다고 말하자나, 그 근거가 맞든 틀리든 설명할 수 있는 역량이 중요해. 지원동기도 이것과 동일하게 내가 이 회사를 어떠한 판단 하에 지원했느냐를 공감,판단이 틀렸더라도 언급하고 설명하면 좋아.

  • 그 회사에 맞춰서 진정성있게 100개 자 정도를 공통 이력서에 넣어서 써봐.

    1. 면접은 많이 보면 느는거같아. 내가 DB 를 잘한다고 하면 난 DB를 잘해요 하면 면접관이 보통 DB로 이야기가 흘러가. 근데 자기만의 노하우가 있어서 긴장을 덜하는게 아주 중요해서 자기가 열심히 연습해야해.

0개의 댓글