나만의 개발 로그 | 고민 로그
23.01.31 TIL 본문
☑️ 쓰레드 start() vs run()
| 호출 | 작동 방식 | 결과 |
| run() | 그냥 일반 메서드 호출 | 새 스택·새 쓰레드 없음 → 순차 실행 |
| start() | JVM이 새 스택을 만들고 run()을 비동기로 호출 | 동시 실행(멀티쓰레드) 가능 |
JVM 메모리 구조: Heap, Method, Static 영역은 공유하지만 각 쓰레드마다 Stack 영역이 따로 생성됨
start()를 호출해야만 이 독립 스택이 마련되어 진짜 병렬 작업을 수행할 수 있다!
☑️ 쓰레드풀 기초
ExecutorService pool = Executors.newFixedThreadPool(8);
pool.submit(task); // 필요할 때마다 재사용
pool.shutdown();
- 장점
- 쓰레드 생성 비용 절감
- 동시 실행 개수 제한 → 리소스 고갈 방지
☑️ @SpringBootApplication
스프링 부트의 경우
@SpringBootApplication 눌러보면 컴포넌트스캔까지 다 포함하고 있어서
@ComponentScan 일일히 안해줘도 알아서 빈 등록해준다!
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootConfiguration // @Configuration
@EnableAutoConfiguration // Spring Boot 자동 설정
@ComponentScan // 컴포넌트 스캔
public @interface SpringBootApplication { ... }
- 다만 스캔 범위를 커스텀해야 할 때는 @SpringBootApplication(scanBasePackages = …) 식으로 조정.
☑️ 레이어 계층 관련 어노테이션!
| 어노테이션 | 역할 |
| @Repository | DAO/리포지토리 식별 + DB 예외 → Spring DataAccessException 변환 (JDBC, MyBatis 時 유용) |
| @Service | 주로 비즈니스 로직 계층 표시 – 특별 기능 X (AOP 타깃 구분 정도) |
| @Controller | MVC 컨트롤러 (@RestController = @Controller + @ResponseBody) |
JPA 리포지토리는 스프링 프레임워크가 이미 예외를 변환해 주기 때문에 @Repository를 생략해도 안전하지만, 계층 명확화를 위해 붙여 두는 곳이 많다고 한다.
☑️ DI 모범 – 생성자 주입 + final
@RequiredArgsConstructor
@Service
public class OrderService {
private final PaymentGateway paymentGateway; // 빼먹으면 컴파일 에러
}
- 불변 필드 + 생성자 주입 →
- 의존 누락 시 컴파일 에러
- 런타임 순환 의존 자동 감지
- 테스트 시 @InjectMocks 없이도 손쉽게 생성자 인자 주입 가능
'TIL&WIL' 카테고리의 다른 글
| 23.02.03 TIL (0) | 2023.02.04 |
|---|---|
| 23.02.01 TIL (1) | 2023.02.02 |
| 23.01.30 TIL (2) | 2023.01.31 |
| 23.01.26 TIL (0) | 2023.01.26 |
| 23.01.18 TIL (0) | 2023.01.19 |
Comments