Post

[KT AIVLE] Spring 4일차 - 심화학습

0. 개요


오늘은 Spring Boot를 위주로 강의를 진행하였습니다.


1. Spring Boot


Spring Boot 프로젝트 구조

Spring Boot 기본 프로젝트 구조

  1. src/main/java
    • Application 클래스
      • @SpringBootApplication 어노테이션이 포함된 메인 클래스.
      • 애플리케이션 실행 진입점 역할 (SpringApplication.run() 호출).
      • 예: com.example.demo.DemoApplication.java
  • Controller
    • 웹 요청을 처리하는 계층 (@RestController, @Controller 사용).
    • URL과 HTTP 메서드 매핑.
    • 예: @GetMapping(“/api/v1/example”).
  • Service
    • 비즈니스 로직 계층.
    • 주로 @Service 어노테이션을 사용하여 표시.
    • 컨트롤러와 데이터 계층 사이의 중재 역할.
  • Repository
    • 데이터베이스와의 상호작용 계층.
    • JpaRepository, CrudRepository 또는 커스텀 데이터 접근 로직을 구현.
    • @Repository로 정의.
  • Entity
    • 데이터베이스 테이블과 매핑되는 클래스 (@Entity 사용).
    • @Table, @Id, @Column 등으로 테이블 스키마 정의.
  • Configuration
    • 사용자 정의 설정 클래스.
    • 예: @Configuration, @Bean, @Enable….
  1. src/main/resources
    • application.properties 또는 application.yml
      • 애플리케이션 설정 파일.
      • 데이터베이스 연결, 서버 포트, 프로파일 등 환경 변수 지정.
      • 예: server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/mydb
  • static/
    • 정적 리소스 파일 (CSS, JS, 이미지 등).
    • 예: /static/js/app.js.
  • templates/
    • HTML 템플릿 파일 (Thymeleaf, Freemarker 등).
    • MVC 모델에서 뷰로 렌더링할 파일.
  • application-.properties
    • 프로파일 기반 설정.
    • 예:
      1
      
      application-dev.properties, application-prod.yml.
      
      1
      
      3. src/test/java
      
  • 테스트 클래스
    • 단위 테스트 및 통합 테스트 작성.
    • @SpringBootTest, @Test, MockMvc 등을 활용.
  1. 기타 주요 파일
    • pom.xml (Maven) 또는 build.gradle (Gradle)
      • 의존성 및 빌드 설정.
      • 예: ```java
    org.springframework.boot spring-boot-starter-web

    ```

  • README.md
    • 프로젝트 설명 및 실행 방법 문서.
  • Dockerfile, docker-compose.yml
    • 컨테이너화 설정 (선택 사항).
  1. 요약 Spring Boot 프로젝트는 다음 계층으로 구성된다.
    • Controller: 요청/응답 처리.
    • Service: 비즈니스 로직.
    • Repository: 데이터 접근.
    • Entity: 데이터베이스 모델링.
    • Configuration: 설정 관리.

Spring MVC / Data

  1. MVC 디자인 패턴 개념:
    • MVC(Model-View-Controller)는 애플리케이션을 세 가지 역할로 나눠 개발.
      • Model: 데이터와 비즈니스 로직 관리.
      • View: 사용자에게 데이터를 표시하는 화면.
      • Controller: 사용자 요청을 받아 Model과 View를 연결.

Spring MVC 특징:

  • Spring MVC는 DispatcherServlet 기반의 프론트 컨트롤러 패턴을 사용.
  • HTTP 요청이 들어오면 DispatcherServlet이 요청을 분석해 적절한 Controller로 전달.
  • Controller는 데이터를 Model에 추가한 뒤, View로 전달.

MVC 구성요소:

  1. Controller:
    • @Controller 어노테이션을 사용해 구현.
    • 사용자 요청(예: /hello)을 받아 데이터를 가공하고 View로 반환.
    • @GetMapping을 통해 HTTP GET 요청을 처리.
    • 예: helloController 클래스가 “Hello User!”를 출력하는 HTML View 반환.
  2. Model:
    • 데이터 저장 및 관리.
    • addAttribute() 메서드를 사용해 데이터를 View에 전달.
    • 예: model.addAttribute(“userName”, “Huni”).
  3. View:
    • Mustache 템플릿 엔진을 사용해 HTML을 동적으로 렌더링.
    • 예: 변수를 HTML에 출력.

주요 동작 과정:

  1. 사용자가 요청을 보냄 → DispatcherServlet이 요청을 받음.
  2. 요청을 분석해 HandlerMapping을 통해 Controller 호출.
  3. Controller에서 데이터를 Model에 담아 View로 전달.
  4. ViewResolver가 알맞은 HTML View를 렌더링하여 사용자에게 응답.

  1. Spring DataBase Access 데이터 접근 방식: Spring은 다양한 데이터베이스 접근 방식을 제공합니다.

  2. JDBC(Java Database Connectivity):
    • Java 표준 데이터베이스 접근 기술.
    • 장점: 모든 DBMS와 호환.
    • 단점: 직접 SQL 작성 및 트랜잭션 관리 필요.
    • 예: PreparedStatement로 SQL 쿼리를 실행.
  3. JdbcTemplate:
    • JDBC를 단순화한 Spring의 클래스.
    • SQL 쿼리 실행, 결과 처리, 예외 처리를 자동화.
    • 예: jdbcTemplate.query(sql, (rs, rowNum) -> rs.getString(“columnName”));
  4. MyBatis:
    • SQL Mapper 프레임워크로 XML 또는 어노테이션 기반으로 SQL 작성.
    • 복잡한 쿼리 처리를 쉽게 만듦.
    • 단점: SQL에 대한 의존성 존재.
  5. JPA(Java Persistence API):
    • ORM(Object Relational Mapping) 기술.
    • 데이터베이스 테이블과 Java 객체(Entity) 간의 매핑.
    • SQL 쿼리를 직접 작성할 필요 없이 메서드 호출로 데이터 관리.

ORM의 장점:

  • 객체 중심으로 데이터를 관리하며 코드 가독성이 높음.
  • SQL 의존도가 낮아 DBMS에 종속되지 않음.
  • 데이터 변경 시 유지보수가 용이.

ORM의 단점:

  • 학습 곡선이 높고 복잡한 쿼리 작성 시 어려움.
  • 성능 최적화를 위해 JPQL, QueryDSL 같은 추가 기술 필요.

Spring Data JPA - 1

  1. 개요:
    • Spring Data JPA는 JPA를 쉽게 사용할 수 있도록 지원하는 Spring 모듈로, Repository 인터페이스를 제공하여 데이터 작업을 단순화합니다.
    • SQL 작성 없이 메서드 이름만으로 데이터 처리 가능.
  2. 주요 내용:
    • Repository 인터페이스:
      • JpaRepository를 상속하여 기본 CRUD 작업을 자동화.
      • 예: public interface UserRepository extends JpaRepository<User, Long> { List findByLastName(String lastName); }
  • Spring Boot 프로젝트 설정:
    • Spring Initializr를 통해 프로젝트 생성.
    • application.yml 또는 application.properties 설정: spring: datasource: url: jdbc:h2:~/testdb username: sa password: password jpa: hibernate: ddl-auto: update show-sql: true
  • Entity 클래스 생성:
    • @Entity, @Id, @GeneratedValue 등 어노테이션을 활용.
    • 예: @Entity public class News { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; }
  • 실습 예제:
    • H2 데이터베이스 사용.
    • JPA로 데이터베이스 테이블 자동 생성 및 CRUD 수행.

Spring Data JPA - 2

  1. 개요:
    • JPA의 고급 기능을 학습하며, 성능 최적화, 복잡한 쿼리 작성, 관계 매핑 등에 대한 심화 내용을 다룹니다.
  2. 주요 내용:
    • JPQL(Java Persistence Query Language):
      • 객체 중심의 쿼리 작성.
      • SQL 독립적이며, 예: @Query(“SELECT n FROM News n WHERE n.title LIKE %:keyword%”) List searchByTitle(@Param("keyword") String keyword);
  • Lazy Loading(지연 로딩):
    • 연관된 데이터를 필요할 때만 가져오도록 설정.
    • 프록시 객체로 관리.
  • DDL 자동화:
    • ddl-auto 속성을 사용하여 테이블 구조 자동 관리.
    • create: 테이블 생성.
    • update: 테이블 구조 업데이트.
  • 변경 감지(Dirty Checking):
    • 영속성 컨텍스트를 통해 엔티티 변경 사항을 자동 감지.
    • 변경된 데이터를 자동으로 DB에 반영.
  • 쓰기 지연:
    • INSERT, UPDATE 쿼리를 트랜잭션 커밋 시점에 한 번에 실행하여 성능 최적화.
  • 고급 기능:
    • 1:1, 1:N, N:M 관계 매핑.
    • Native Query: SQL 쿼리를 직접 작성하여 데이터베이스와 상호작용.

실습 내용:

  1. 프로젝트 생성:
    • Spring Initializr로 Spring Boot 프로젝트 생성.
    • 필요한 의존성(Spring Data JPA, H2 Database 등) 추가.
  2. 데이터베이스 설정:
    • application.properties 또는 application.yml 파일에 데이터베이스 연결 설정 작성.
  3. Entity 클래스 생성:
    • @Entity 어노테이션으로 데이터베이스 테이블과 매핑.
    • 예: News 엔티티로 뉴스 데이터를 저장.
  4. Repository 인터페이스 생성:
    • JpaRepository를 상속하여 기본 CRUD 기능 구현.
    • 추가적으로 JPQL 또는 Native Query를 사용한 데이터 조회.
  5. Controller와 Service 계층 구현:
    • 비즈니스 로직은 Service 계층에 작성.
    • Controller에서 사용자의 요청을 받아 데이터를 처리.
  6. 테스트:
    • 데이터 삽입, 조회, 수정, 삭제 테스트.
    • H2 Database Console(http://localhost:8080/h2-console)을 사용하여 데이터베이스 확인.


3. 후기


오늘은 주로 Spring Boot의 구조 및 다양한 패턴과 실제 사용방법을 위주로 학습을 진행하였습니다.

다양한 오류 발생시 대처하는 방법을 익힐 수 있었습니다!

This post is licensed under CC BY 4.0 by the author.