[KSUG] 기초 지식 스터디 1회차 요약

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차로 정리해서 내 말로 다시 적어두면 기억에 더 오래 남을 것 같다는 생각이 들었다. 다음 스터디부터는 나도 그렇게 해보기로 다짐했다.