Spring
-
동시성 제어 [2] DB Lock개인 공부/spring 2024. 8. 5. 19:53
🔴 분산 Lock지난 번 글에 이어 동시성 문제를 해결해보려고 한다.java 동시성 제어 [1]java 처리분산된 여러 서버에서 서버마다 락을 처리해놔도 여러 서버가 존재한다면 동시성은 해결될 수 없다. 그래서 여러 서버가 DB 한곳으로 요청할때 DB에서 락을 걸어 동시성 이슈를 해결하는 방법에 대해 알아보자.🟠 DB Lock (비관적 락)데이터를 저장하고 있다면 당연히 DB를 사용하고 있을것이다. RDB를 사용하고 있는 경우 query를 통해 Lock을 걸어줄 수 있다.여기서 비관적 락이란 트랜잭션이 발생하면 DB에서 락을 걸어서 대기시키는 것이다.🟢 Service@Service@RequiredArgsConstructor@Transactional(readOnly = true)public class..
-
동시성 제어 [1] java 처리개인 공부/spring 2024. 8. 5. 19:51
🔴 동시성 제어란?회사 공고나 백엔드 개발자로써 성장하다 보면 가장 많이 듣게되는 부분 중 하나가 동시성 제어다. 특히 자바 개발자는 스프링의 멀티 쓰레드 특성상 해당 부분을 해결할 능력을 갖추는 것이 필수이다.여러 쓰레드가 동시에 요청을 처리하는 프로세스를 순서대로 처리되도록 개발자가 처리해주면 되는 것이다.🟠 고려할 점동시성을 처리하기 전에 환경, 프로젝트 규모를 먼저 고려해야 한다. 작은 프로젝트(=1개의 서버만 운영)작은 프로젝트라면 하나의 서버에서 처리하고 있기 때문에 서버 내에서 java의 Lock이나 Synchronize를 통해 처리할 수 있다.큰 프로젝트(=여러개의 서버 운영 =분산 시스템)프로젝트 당 쓰레드도 여러개지만 서버 자체도 여러개라 Lock을 처리해줄 외부 설정이 필요함. D..
-
spring[7] @Bean 생명주기개인 공부/spring 2021. 5. 20. 22:46
Bean의 생명주기 Service로직을 구현하는 구현체 Bean도 있겠지만 web application에서 DB connection pool이나 socket과 같이 application 시작 시점에 미리 생성해두고 종료 시점에 종료시키는 작업을 진행해야하는 경우도 있습니다. spring에서는 이 작업을 어떻게 실행하고 있는지 알아보겠습니다. DB에 연결하는 예시를 코드로 살펴보겠습니다. public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); connect(); call("초기화 연결 메시지"); } public void setUrl(String url..
-
spring[6] DI 의존관계 주입개인 공부/spring 2021. 5. 19. 16:14
DI (의존관계 주입) 의존관계 주입의 방법은 크게 4가지가 존재합니다. 생성자 주입 수정자(setter) 주입 필드 주입 일반 메서드 주입 생성자 주입 특징 생성자 호출 시점에 1번만 호출되는 것을 보장합니다. 불변, 필수 의존관계에 사용됩니다.만약 spring bean class에 생성자가 단 1개라면 @Autowired가 생략되어도 spring이 자동으로 주입해줍니다.위 코드와 아래 코드와 동일한 실행 결과가 나옵니다. @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolic..
-
spring[5] ComponentScan과 Component개인 공부/spring 2021. 5. 16. 08:48
Component Sacn 지금까지 빈을 등록하기 위해서 AppConfig class에 사용자가 일일히 @Bean으로 관리해주어야 했습니다. 하지만 이건 개발자에게 너무 귀찮은 작업이고 누락하게 되면 큰 장애가 발생하게됩니다. 그래서 Spring은 @Bean으로 일일히 등록하지 않아도 자동으로 스프링 빈으로 등록해주는 @ComponentScan과 @Component annotation을 제공합니다. 컴포넌트 스캔을 사용하게 되면 DI가 애매해집니다. 지금까진 수동으로 의존관계를 주입했지만 Bean이 자동으로 등록되게되니 의존관계를 설정할 수 있는 부분이 사라진것입니다. 그래서 @Autowired annotation을 지원한다. @Autowired에 대한 부분은 다음에 공부해보겠습니다. Component ..
-
Spring[4] Spring의 Singleton Container개인 공부/spring 2021. 5. 15. 19:54
Singleton 싱글톤이란? Web application은 일반적으로 다수의 사용자가 하나의 Server에 동시의 많은 요청을 하게됩니다. Singleton으로 디자인하지 않은 Web application의 java는 사용자의 요청마다 하나의 객체를 생성하게 되고 10,000건의 요청은 10,000개의 객체를 상속받은 객체라면 그 이상의 객체를 생성하게 됩니다. 이러한 방식으로 디자인된 application은 엄청난 메모리 낭비를 하게됩니다. 싱글톤 디자인을 사용하게 되면 java server에서 여러개의 요청이 들어와도 class Instance가 1개만 생성되는 것을 보장하게됩니다. java로 싱글톤 패턴을 구현해보기static final을 사용하여 java server에서는 오직 한개의 insta..
-
Spring[3] Spring Container와 Spring bean개인 공부/spring 2021. 5. 15. 11:48
Spring 적용해보기 AppConfig Spring 기반으로 변경 @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } } 기존의 AppConfig 파일을 Spring annotation을 사용하여 Spring Container로 등록합니다. Spring Container란 ApplicationContext를 Spring Container라 부릅니다. Ap..
-
spring[2] Spring을 사용하지 않은 Java Web Project개인 공부/spring 2021. 5. 14. 22:50
Spring을 사용하지 않은 Java Web Project control과 view는 생각하지 않고 Model service 로직만 생각하여 예시를 들어보겠습니다. 회원가입 Model (class) 모델 객체를 만듭니다. Service (Interface) 인터페이스를 만들고 ServiceImpl (class) 구현체를 만듭니다. code를 테스트 해봅니다. Model 객체 생성 public class Member { private Long id; private String name; public Member(Long id, String name) { this.id = id; this.name = name; } public Long getId() { return id; } public void setId..