본문 바로가기
{"CODING": undefind};/JAVA

[스파르타 재직자 부트캠프] Java Spring 마스터 과정 2기 - 1주차

by 잼잼미 2025. 7. 1.

 

큰 맘 먹고 신청한 스파르타 재직자 부트캠프가 드디어 시작했다.

 

벌써 개발자의 길에 접어든지 어느덧 3년이 훌쩍 지나버렸는데, 입사~3년 까지는 거의 프론트엔드 쪽 작업, 가끔의 연동 작업을 위한 백엔드 개발을 했다.

그런데 최근 들어 회사 내 다른 솔루션 제품 개발에 참여하게 되면서 급격히 백엔드 개발 비중이 높아졌는데,

애매한 백엔드 개발 지식을 갖고 있다보니 업무를 진행할 때마다 매번 검색하고 찾아보느라 시간이 오래 걸리는 내 모습을 보며, 개선이 시급하다는 위기감을 느꼈다.

 

그래서 시작했는데... 평일 20~23시, 토요일 9~14시 수업을 생각보다 얕잡아봤었던 과거의 나

 

‘매일매일 수업 끝난 뒤 복습하고 정리하고 자자’라고 다짐했지만, 

정리는커녕 복습조차 제대로 하지 못한 채 수업만 겨우 따라가다 어느새 3주 차에 접어들어버렸다.

 

그래서 위기감을 느끼고 급히 정리해 보는

1주차 내용

 

1일차(6/16). 스프링 프레임워크 시작하기

  • 스프링의 철학: POJO 기반 경량 프레임워크, EJB의 복잡성 극복.
  • 핵심 특징:
    • IoC/DI: 스프링 컨테이너가 객체 생성·주입, 낮은 결합도 실현.
    • AOP: 로깅·트랜잭션·보안 같은 횡단 관심사 분리.
    • PSA: 다양한 기술(JPA, JDBC 등)을 일관된 추상화로 사용.
  • 아키텍처 흐름: Tomcat → DispatcherServlet → Spring Container → Controller → Service → Repository.
  • 실습:
    1. Spring Initializr·Gradle로 프로젝트 템플릿 생성.
    2. Docker MySQL 연결, application.yml 설정.
    3. Undertow(대체 웹서버), Swagger(문서), Flyway(DB 마이그레이션), MapStruct(매핑) 등 주요 라이브러리 설정.
    4. IntelliJ 자동 정렬·코드 스타일 적용.

2일차(6/17). 스프링을 위한 핵심 Java 문법

  • OOP 4대 원칙: 클래스·객체, 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism).
  • 인터페이스 vs 추상 클래스:
    • 인터페이스(implements): 다중 구현, 역할 정의, DI 느슨한 결합.
    • 추상 클래스(extends): 단일 상속, 공통 로직 코드 재사용.
  • 컬렉션 프레임워크: List, Set, Map의 구조와 시간 복잡도 비교.
  • 예외 처리: try-catch, 사용자 정의 예외.
  • 어노테이션: 코드 메타데이터, 스프링 Bean 식별.
  • 제네릭: 타입 안정성 확보.
  • 람다·스트림 API: 함수형 프로그래밍, peek() 등 중간 연산.
  • 반복문 비교: for, 향상된 for-each, Stream.forEach().

3일차(6/18). Spring Data JPA 시작하기

  • ORM 개념: 객체-관계 불일치 해결, Hibernate 구현체.
  • Spring Data JPA: JPA 표준 위에 JpaRepository 제공, CRUD 코드 자동 생성.
  • Flyway:
    • DB 형상 관리: Git 연동된 SQL 마이그레이션 파일(V__*.sql)로 스키마 이력 관리.
    • 동작 원리: flyway_schema_history 테이블로 실행 내역 추적, 자동 migrate.
  • HikariCP: 기본 Connection Pool, 경량·고성능.
  • 엔티티 설계:
    • @Entity, @Table, @Id, @GeneratedValue, @Column 등 핵심 어노테이션.
    • PK 전략, 네이밍 컨벤션, 제약조건 설정.
  • Repository 작성:
    • 인터페이스 상속 방식, 메서드 이름 기반 쿼리, @Query 커스텀 쿼리.
  • 실습: 사용자 테이블 설계부터 Repository 구현까지.

4일차(6/19). 데이터 설계와 연관관계

  • 단일 테이블 설계:
    • 대리 키(PK) vs 자연 키, 제약조건(NOT NULL, UNIQUE) 설정.
  • 연관관계 설계:
    • 1:N(@OneToMany/@ManyToOne), N:N(Junction Table → 별도 엔티티 승격), 계층 구조(Self-Referencing).
    • mappedBy, Owner 개념, Fetch 전략 기본 이해.
  • 정규화 vs 반정규화:
    • 1NF~3NF, 이상(Anomaly) 방지, 성능 고려 반정규화.
  • 쇼핑몰 예제: User, Product, Category, Purchase, PurchaseItem 테이블 및 JPA 매핑.
  • FOREIGN KEY 제약:
    • 장점(무결성, 명시적 관계) vs 단점(성능 오버헤드, 마이그레이션 복잡성, 분산 시스템 미지원).
    • 상황에 맞는 선택 전략.

5일차(6/20). ORM 심화 및 데이터 로딩 전략

  • 로딩 전략 필요성: 객체 그래프 vs 테이블 분리 조회 딜레마.
  • LAZY vs EAGER:
    • LAZY: 필요한 시점에 프록시 통해 추가 쿼리 발생, 초기 속도 빠름.
    • EAGER: JOIN으로 즉시 로딩, 불필요 데이터 조회 위험.
  • N+1 문제:
      1. 기본 조회 1번 + 연관 조회 N번 → 성능 저하.
      2. 반복문 안에서 호출 시 LAZY에서도 발생.
  • 해결 기법:
    • Fetch Join: JPQL JOIN FETCH로 한 번에 조회.
    • @BatchSize: IN 절 묶음 조회.
  • Entity vs DTO 분리:
    • 엔티티는 상태 관리, DTO는 화면/API 응답용 구조체로 분리하여 성능·보안 강화.