25년 KSUG에서 주니어 및 취준생 분들과 함께한 스터디 진행 기록입니다.
스프링 프레임워크 혹은 데이터베이스에 대한 스터디를 진행 했고, 저는 스프링 프레임워크를 선택했습니다.
기여해주시는 멘토 분들께 항상 감사드립니다.
이번 시간에는
- Spring Boot - 제1장 스프링 부트란?
- Database - 제1장 데이터 저장구조와 특징
부분을 정리해오기로 했다.
그런데 Spring Boot 발표자 2번으로 내가 선정됨 ...
발표 하는 건 항상 긴장된다.
그래도 2번째 발표자이길 다행이지 🥹 1번 분께서 대부분을 말씀 해주시고 겹치지 않는 부분만 따로 발표했다.
이렇게 해서 어떻게 면접도 보고 공개 장소에서도 발표를 할지... 항상 걱정이 많다.
스터디 참여자가 6명인데 그 중 2명이 발표인 거면 항상 발표할 확률이 많다.
그래도 이 스터디 덕분에 발표할 기회가 많이 생길 것 같아 익숙해지면 좋겠다.
아래는 GPT를 이용한 스터디 요약본이다.
🌱 1. Spring 핵심 개념
✅ IoC (Inversion of Control, 제어의 역전)
- 객체의 생성과 생명주기 관리를 개발자가 아닌 Spring IoC Container가 담당
- 전통적인 Java 코드: 객체 직접 생성 (new)
- Spring 방식: Container가 객체 생성 및 주입
✅ DI (Dependency Injection, 의존성 주입)
- 생성자 주입: 가장 권장되는 방식. 불변성과 테스트 용이성 확보
- 세터 주입: 선택적 주입에 적합
- 필드 주입: 간결하지만 테스트 어려움
- 생성자 주입이 안전한 이유: 객체 생성 시점에 모든 의존성 존재 여부 확인 가능 → Null 방지
🧰 2. Spring 구성 요소 및 Bean 등록
✅ ApplicationContext
- Spring의 핵심 컨테이너. Bean을 관리하는 메모리 공간
- 구현체:
- AnnotationConfigApplicationContext (애노테이션 기반)
- ClassPathXmlApplicationContext (XML 기반)
- WebApplicationContext (웹 환경 전용)
✅ Component Scan & Annotation
- @Component, @Service, @Repository, @Controller: 모두 @Component의 메타 애노테이션
- 구분의 목적: 레이어 구분 및 가독성
- 컴포넌트 스캔 시 ApplicationContext에 Bean으로 등록됨
✅ Bean 이름 생성 방식
- @Component("myBean") 처럼 명시 가능
- 미지정 시 클래스명을 기준으로 생성 (MyService → myService)
- Introspector.decapitalize() → StringUtils로 변경됨 (Java EE 의존성 제거 목적)
🚀 3. Spring Boot 기능 및 구조
✅ Spring Boot Starters
- 의존성 자동 구성 (spring-boot-starter-web, spring-boot-starter-data-jpa 등)
- 버전 호환 자동화 → 개발 생산성 향상
✅ AutoConfiguration (자동 구성)
- @SpringBootApplication = @ComponentScan + @EnableAutoConfiguration + @Configuration
- 필요한 설정을 감지하여 자동으로 적용 (ex. H2 DB 존재 시, 자동 설정 적용)
✅ 내장 WAS (Tomcat)
- WAR 파일 불필요, main() 실행 시 내장 톰캣 자동 구동
- 다른 WAS로 교체 가능 (Jetty, Undertow 등)
🧵 4. AOP (Aspect-Oriented Programming)
✅ 개념 및 목적
- 관심사의 분리 (Separation of Concerns)
- 핵심 로직(비즈니스)과 공통 관심사(로깅, 트랜잭션 등) 분리
✅ 구성 요소
- Aspect: 공통 기능을 모듈화한 클래스
- Advice: 공통 기능의 실제 구현 (Before, After 등)
- JoinPoint: Advice가 적용 가능한 지점
- Pointcut: Advice 적용 대상을 정의
- Target: Advice 적용 대상 객체
- Proxy: Target을 감싸는 프록시 객체
✅ Proxy 방식
- 외부에서 호출 시 AOP 적용 가능
- 자기 자신의 메서드를 호출하는 경우 AOP 미적용 주의
🧱 5. 데이터 접근 기술 발전
✅ JDBC → DAO → JPA → Spring Data JPA
- JDBC: SQL 직접 작성, 반복 코드 많음
- DAO 패턴: 로직 분리, 여전히 SQL 수작업 필요
- JPA: ORM 기반, SQL 없이 객체 중심 개발
- Spring Data JPA: CRUD 인터페이스 자동 구현 (JpaRepository 등)
✅ Hibernate
- 대표적인 JPA 구현체
- 객체와 테이블 매핑, SQL 자동 생성
📂 6. 데이터베이스 저장 구조 (스터디 후반부)
✅ 테이블 저장 구조 (분리형)
- 데이터와 인덱스를 분리 저장
- RowID 구성: 객체번호 + 파일번호 + 블록번호 + 슬롯번호
- 슬롯 기반 위치 추적 → 데이터가 이동해도 RowID로 추적 가능
✅ 응축 및 로우 이주
- 로우가 자주 이동하거나 공간이 파편화될 경우 응축 발생
- 로우 이주 시 RowID가 변경될 수 있음 → 간접 주소 방식으로 해결 가능
✅ 클러스터링 팩터 (Clustering Factor)
- 인덱스 접근 시 물리적인 데이터 밀집도 지표
- 값이 낮을수록 성능 좋음 (물리적으로 가까이 있는 데이터)
✅ 테이블 접근 패턴
- 소형 테이블: 랜덤 저장도 무방
- 중형 테이블: 정렬 후 저장 권장
- 대형 테이블: 파티셔닝 및 전략적 인덱스 구성 필요
📝 기타 참고 포인트
- Component 구분 이유: Layer(Controller → Service → Repository) 간 책임 분리 및 유지보수성 향상
- 생성자 주입을 권장하는 이유: 순환 참조 방지, 애플리케이션 초기 상태에서 오류 검출 가능
- 면접 팁: 너무 전문 용어 사용하지 말고, 쉽게 설명할 수 있는 수준으로 이해하기
중간에 기도님께서 참고용으로 깃 레포지토리를 공유해주셨는데, 면접 질문과 그에 대한 답변이 정리되어 있는 저장소였다.
그걸 보고 나도 키워드와 답을 2차로 정리해서 내 말로 다시 적어두면 기억에 더 오래 남을 것 같다는 생각이 들었다. 다음 스터디부터는 나도 그렇게 해보기로 다짐했다.
'알아두면 좋은 개발 지식 > KSUG' 카테고리의 다른 글
| [KSUG] 기초 지식 스터디 2회차 요약 (2) | 2025.08.03 |
|---|---|
| 스프링 부트에 대한 간단한 고찰 - 2 (4) | 2025.07.31 |
| 스프링 부트에 대한 간단한 고찰 - 1 (4) | 2025.07.24 |
| [完] 스프링 배치 스터디 오프라인 모임 (with 스페셜 게스트 이동욱님, 김남윤님) (3) | 2024.12.23 |
| [10회차] 스프링배치 플로우 컨트롤 하기 (3) | 2024.12.16 |