검색결과 리스트
Singleton에 해당되는 글 2건
- 2024.01.29 Singleton 패턴, JAVA에서의 응용과 이해 4
- 2021.05.04 스프링 입문 맛보기 3
글
Singleton 패턴, JAVA에서의 응용과 이해
오늘은 프로그래밍에서 많이 사용되는 디자인 패턴 중 하나인 Singleton 패턴에 대해 이야기해보려고 합니다.
Singleton 패턴은 객체 생성을 제한하여 하나의 인스턴스만을 사용하도록 하는 패턴으로, JAVA에서도 많이 활용되는데요.
이번 글에서는 Singleton 패턴의 응용과 JAVA에서의 사용법에 대해 자세히 알아보고자 합니다. 함께 공부해보시죠!
목차
1. Singleton 패턴의 이해
2. Singleton 패턴의 적용 시나리오
3. JAVA에서의 Singleton 패턴의 적용
4. Singleton 패턴의 코드 이해
5. Singleton 패턴의 싱글스레드 구현
6. Singleton 패턴의 멀티스레드 환경에서의 구현
7. Singleton 패턴의 장단점
8. Singleton 패턴 대안 방식 및 향상된 Singleton 패턴 이해
9. 실제 프로젝트에서의 Singleton 패턴의 활용 사례
10. JAVA에서 Singleton 패턴의 정상적인 활용을 위한 조언
1. Singleton 패턴의 이해
Singleton 패턴은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 특정 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다. 이를 통해 객체를 공유하고, 자원의 낭비를 줄일 수 있습니다.
2. Singleton 패턴의 적용 시나리오
Singleton 패턴은 여러 가지 상황에서 유용하게 적용될 수 있습니다. 예를 들어, 데이터베이스 연결, 로그 라이터, 캐시 매니저 등 여러 곳에서 하나의 인스턴스만 필요한 경우에 Singleton 패턴을 적용할 수 있습니다.
3. JAVA에서의 Singleton 패턴의 적용
JAVA에서 Singleton 패턴을 적용하는 방법은 다양합니다. 가장 일반적으로 사용되는 방법은 클래스 내부에 private static 변수로 인스턴스를 선언하고, getInstance() 메서드를 통해 해당 인스턴스를 반환하는 방식입니다.
4. Singleton 패턴의 코드 이해
아래는 JAVA에서 Singleton 패턴을 구현하는 코드의 예시입니다.
public class Singleton {
private static Singleton instance;
private Singleton() {
// private 생성자
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
5. Singleton 패턴의 싱글스레드 구현
싱글스레드 환경에서는 위에서 소개한 코드와 같이 간단하게 Singleton 패턴을 구현할 수 있습니다. getInstance() 메서드에서 인스턴스가 null인 경우에만 인스턴스를 생성하면 됩니다.
6. Singleton 패턴의 멀티스레드 환경에서의 구현
멀티스레드 환경에서는 다수의 스레드가 동시에 getInstance() 메서드를 호출하면, 여러 개의 인스턴스가 생성되는 문제가 발생할 수 있습니다. 이를 해결하기 위해 동기화 처리를 해야 합니다. 예를 들어, getInstance() 메서드에 synchronized 키워드를 사용하거나, DCL(Double-Checked Locking) 방식을 적용할 수 있습니다.
7. Singleton 패턴의 장단점
Singleton 패턴은 다음과 같은 장단점이 있습니다.
장점:
- 하나의 인스턴스만 필요한 경우 유용하게 사용할 수 있습니다.
- 객체를 공유하여 자원을 효율적으로 활용할 수 있습니다.
단점:
- 단일 책임 원칙을 위배할 수 있습니다.
- 테스트가 어려울 수 있습니다.
- 의존성을 가질 경우 코드의 복잡성이 증가합니다.
8. Singleton 패턴 대안 방식 및 향상된 Singleton 패턴 이해
Singleton 패턴은 여러 대안 방식이 존재하며, 이를 통해 향상된 Singleton 패턴을 구현할 수 있습니다. 예를 들어, Enum을 이용한 Singleton 패턴, 초기화-on-demand holder idiom 등이 있습니다.
9. 실제 프로젝트에서의 Singleton 패턴의 활용 사례
실제 프로젝트에서 Singleton 패턴은 다양한 곳에서 활용됩니다. 예를 들어, 스프링 프레임워크에서는 Bean 객체들이 Singleton으로 관리되며, 전역적으로 공유되어 사용됩니다.
10. JAVA에서 Singleton 패턴의 정상적인 활용을 위한 조언
JAVA에서 Singleton 패턴을 정상적으로 활용하기 위해서는 다음과 같은 조언을 따를 수 있습니다.
- Lazy Initialization 방식을 적용하여 필요한 시점에 인스턴스를 생성하는 것이 좋습니다.
- 동기화 처리는 필요한 경우에만 적용해야 합니다.
- 의존성 주입(Dependency Injection)을 활용하여 유연한 코드를 작성할 수 있습니다.
이렇게 JAVA에서 Singleton 패턴을 이해하고 적용하는 방법에 대해 알아보았습니다.
Singleton 패턴은 객체 지향 프로그래밍에서 중요한 개념이므로, 다양한 상황에서 유용하게 활용할 수 있습니다.
'Java 정리' 카테고리의 다른 글
java 8 정리11 (0) | 2021.07.01 |
---|---|
java 8 정리10 (0) | 2021.06.30 |
java 8 정리9 (0) | 2021.06.17 |
java 8 정리8 (0) | 2021.06.02 |
java 8 정리7 (0) | 2021.05.26 |
설정
트랙백
댓글
글
스프링 입문 맛보기 3
인프런 강의 3일차.
- 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (김영한 강사님)
1. 테스트 클래스 생성(Ctrl + Shift + T)
- 한글로 작성해도 상관없음 (빌드될 때 실제 코드에 포함되지 않는다)
- 테스트 메소드 작성 시 추천하는 방법 (given, when, then)
2. AssertThrow
- 메소드 실행 시 해당 에러가 발생해야 test 통과를 의미
- A와 B의 테스트 결과는 같다.
A. try - catch exception
//given
Member member1 = new Member();
member1.setName("Spring");
Member member2 = new Member();
member2.setName("Spring");
//when
memberService.join(member1); //member1 회원가입
try {
memberService.join(member2); //member2 회원가입, 이 때 name이 둘 다 Spring이므로 익셉션발생.
fail();
}catch (IllegalStateException e){
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다"); //발생한 에러 메시지가 "이미 ~ "와 같다면 테스트 통과
}
B. AssertThrow
//given
Member member1 = new Member();
member1.setName("Spring");
Member member2 = new Member();
member2.setName("Spring");
//when
memberService.join(member1); //member1 회원가입
//member2 회원가입 시 IllegalStateException 발생 시 assertThrow 발생. 즉, 테스트 통과
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
3. Dependency Injection
- 각 테스트를 실행하기 전 같은 인스턴스를 사용하기 위해 인스턴스 생성 때 외부에서 인스턴스를 인자로 넣어줌
//MemberService.java
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository; //생성자에서 DI
}
//MemberServiceTest.java
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository); //Dependency Injection
}
4. 스프링 빈과 의존 관계 설정
- 스프링이 빈이 관린된다는 의미 : 스프링이 최초 실행될 때 스프링 컨테이너가 생성되는데, 이 때 @Controller 가 있으면 해당 Controller 객체를 생성해서 스프링이 넣어두고 관리한다.
- 스프링이 관리는 객체의 경우 스프링에서 관리할 수 있게끔 생성자에 @Autowired을 붙여서 관리해야한다.
- 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존 관계를 외부에서 넣어주는 것을 DI, 의존성 주입이라 한다.
- 3번에서는 개발자가 직접 넣어주었고, 아래 소스는 @Autowired에 의해 스프링이 주입해준다.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService){
this.memberService = memberService;
}
//위 코드 실행 시 아래 오류 발생
/*
Parameter 0 of constructor in hello.hellospring.controller.MemberController required
a bean of type 'hello.hellospring.Service.MemberService' that could not be found.
*/
//memberService는 스프링 빈에 등록되어 있지 않기 때문에 최초 스프링 컨테이너 실행 때 찾을 수 없는 객체이다.
//memberService클래스에 @Service를 사용하여 스프링 빈에 등록해주면 정상적으로 실행된다.
//Repository도 마찬가지로 @Repository를 사용하여 스프링 빈에 등록해주어야 한다.
}
5. 스프링 빈을 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
6. 컴포넌트 스캔과 자동 의존관계 설정
- @Component : 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
- 스프링 시작 시 Component 애노테이션이 있으면 자동으로 객체를 생성해서 스프링 컨테이너에 가지고 있다.
- @Autowired가 있을 시 해당 객체들을 연결시켜둔다.
- @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
->@Contoller, @Service, @Repository : 해당 애노테이션에 들어가보면 @Component로 선언되어있다.
- 단, 이 때 스캔하는 대상은 @SpringBootApplication 에 등록된 하위 패키지만 스캔한다.
-> @SpringBootApplication 애노테이션에 들어가보면 @ComponentScan 애노테이션이 있다.
- 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록한다(하나의 인스턴스만 등록해서 공유)
- 설정을 통해 싱글톤이 아니게 할 수 있지만 특별한 경우가 아니면 전부 싱글톤을 사용한다.
* Ctrl + R : 가장 최근에 실행한 테스트 재실행
'Spring 정리' 카테고리의 다른 글
스프링 입문 맛보기 6 (0) | 2021.08.04 |
---|---|
스프링 입문 맛보기 5 (0) | 2021.07.14 |
스프링 입문 맛보기 4 (0) | 2021.07.06 |
스프링 입문 맛보기 2 (0) | 2021.04.29 |
스프링 입문 맛보기 (0) | 2021.04.28 |