수달이네 기술 블로그

1. SpringBoot 기초 본문

웹/Spring

1. SpringBoot 기초

슬픈 수달이 2025. 12. 8. 22:49

SpringBoot 파일 구조

|- src/
|    |- main/
|    |    |- java/
|    |    |   |_ com.example.demo/
|    |    |         // Java 소스 (Controller, Service, Repository 등)
|    |    |- resources/
|    |    |    |- application.properties (또는 yml)
|    |    |    |- static/         ← CSS, JS, 이미지
|    |    |    |_ templates/      ← Thymeleaf, HTML 파일
|    |    |_ webapp/ (선택: MVC 사용 시)
|    |    |    |_ WEB-INF/
|    |    |          |_ views/      ← JSP 사용 시 JSP 파일
|    |_ test/java/         ← 테스트 코드
|
|- build.gradle 또는 pom.xml      ← 의존성 관리 파일
|- .classpath / .project      ← 이클립스 설정 파일
|_ target/      ← 컴파일/빌드 결과물

구조별 역할

src/main/java : Controller, Service, Repository등 자바코드등 삽입

src/main/resources: 설정파일(application.properties/xml), static, template 관련 파일 작성예정

src/main/webapp: JSP 기반 MVC 프로젝트에서 사용

WEB-INF/views:   JSP 파일 위치

static: css, js, image 등 정적 파일(spring boot)

templates: Thymeleaf와 같은 템플릿 페이지(spring boot)

스프링 용어 정리

API

  • 어플리케이션 간 상호작용을 가능하게 해주는 인터페이스
  • 다른 어플리케이션에서 제공하는 기능을 사용, 데이터 교환 할 수 있으며
  • 해당 기능을 사용할 때 내부 구현을 몰라도 사용할 수 있도록 도와준다

라이브러리

  • 재사용이 가능한 코드 모음(도구)
  • 라이브러리에서 제공해주는 함수를 활용하면 개발자가 복잡한 알고리즘을 처음부터 구현할 필요가 없다

프레임워크

  • 특정 목적을 위해 만들어진 틀, 규칙이다
  • 어플리케이션 개발을 위한 템플릿의 역할을 하며, 전체적인 구조와 패턴을 정의한다
  • 같은 구조와 패턴을 사용하여 모든 개발자들이 표준화된 방식으로 개발을 할 수 있게 도와준다 개발 시간을 단축시켜준다

스프링 프레임워크

자바기반 웹 어플리케이션 개발에 사용하는 프레임워크이다

개발의 복잡성을 줄이고, 비교적 쉽게 테스트가 가능하여 생산성을 높여준다

유지관리에 용이하며, 다른 프레임워크와 연동이 매우 뛰어나다(접착성)

스프링 프레임워크의 주요 특징

POJO(Plain Old Java Object) 기반

  • 순수 자바객체를 사용하므로 기존 코드들을 재사용 가능하며, 테스트와 유지보수에 유리하다

DI(Dependency Injection) : 의존성 주입

  • 스프링의 핵심 기능이며 클래스들간의 의존성을 낮춰주고 코드의 재사용성을 높인다.
  • 의존성을 낮추기 위해 직접 코딩하는 것이 아니라 스프링에서 지원해주는 의존성 주입이라는 기술을 사용한다
  • 어노테이션으로 쉽게 의존 주입이 가능하다

+) 의존성 : 클래스가 다른 클래스의 기능을 사용하려고 연결되어 있는 관계

나쁜 예)
   public interface MessageService{
      void sendMessage(String msg, String to);
   }

   public class EmailService implements MessageService{
      public void sendMessage(String msg, String to){
         //이메일 전송 로직
      }
   }

   public class PhoneService implements MessageService{
      public void sendMessage(String msg, String to){
         //문자 전송 로직
      }
   }

   public class MyService{
      private MessageService messageService;
   
      public MyService(){
         //직접 의존 객체 생성
         messageService = new EmailService(); 
         // 직접생성, 결합도가 높다(문자전송로직으로 바꾸기 위해서는 코드를 뜯어 고쳐야한다
      }

      public void process(String msg, String to){
         messageService.sendMessage(msg, to);
      }
   }
좋은 예)
   결합도를 낮추어 느슨한 관계 만들기

   public class MyService{
      private MessageService messageService;
   
   public class MyService{
      private MessageService messageService;

   public class PhoneService implements MessageService{
      public void sendMessage(String msg, String to){
         //문자 전송 로직
      }
   }

   public class MyService{
      private MessageService messageService;

      public MyService(MessageService messageService){
         //MyService는 어떤 서비스가 들어올지 전혀 모름
         //MyService는 메시지를 어떻게 보내는지는 신경쓸 필요가 없음
         //결합도 ↓(느슨한 연결), 재사용 ↑, 유지보수 ↑
         this.messageService = messageService;
      }
   }
      //스프링이 이 객체 연결(주입)을 자동으로 해주는 기술 DI

AOP(관점 지향 프로그래밍)

  • 공통되고 반복되는 관심사(기능 등)를 분리하여 모듈화하는 기법이다.
  • 관심사를 분리하면 개발자는 핵심 로직에만 집중해서 코드를 작성할 수 있고, 유지보수가 쉬워진다.
  • 이렇게 분리한 기능을 관점(Aspect) 이라고 한다.

종단 관심사 (핵심 관심사, Core Concern)

  • 개발자가 원래 만들려고 하는 핵심 기능이다.
  • 예시: 회원가입 기능을 만든다면
    • 회원 정보 저장
    • 비밀번호 암호화
    • DB에 INSERT
    등이 종단 관심사에 해당한다.
  • 기능마다 종단 관심사는 다르며, 프로젝트의 주 목적과 직접적으로 관련이 있다.

횡단 관심사 (공통 관심사, Cross-cutting Concern)

  • 여러 기능(메소드, 클래스)에 공통으로 필요하지만, 그 기능의 본질과는 직접적인 관련이 없는 부분이다.
  • 예시:
    • 로그 출력
    • 예외 처리
    • 트랜잭션 관리
    • DB Connection 연결 / 해제
  • 다양한 기능에 가로질러 반복해서 나타나며,
    • 핵심 기능 코드에 섞여 들어가면 코드가 지저분해지고
    • 변경이 필요할 때 모든 메소드를 수정해야 해서 관리도 어려워진다.

회원가입 로직에서의 종단 / 횡단 관심사

getConnection();        // DB 연결          [횡단]
[log.info](<http://log.info>)("회원가입");    // 로그            [횡단]
startTransaction();     // 트랜잭션 시작    [횡단]

insertUser();           // 회원가입 로직    [종단]

commit();               // 트랜잭션 종료    [횡단]
closeConnection();      // DB 닫기         [횡단]
  • JDBC로 회원가입, 로그인 기능을 구현할 때
  • 두 코드에서 중복되는 관심사는 Connection 객체를 얻어오는 부분이다.
  • 이런 공통 로직은 여러 종단 관심사(회원가입, 로그인 등)에 공통으로 들어가 있으므로 횡단 관심사라고 볼 수 있다.
  • 예를 들어 DBConnector 객체를 따로 만들어서 공통으로 사용하도록 분리하는 방식이 AOP 관점과 맞닿아 있다.

스프링에서의 트랜잭션 관리

  • 트랜잭션 설정을 XML 설정이나 @Transactional 어노테이션을 통해 매우 쉽게 처리할 수 있다.
  • 개발자가 매번 startTransaction(), commit() 같은 코드를 직접 작성하지 않고도, 공통으로 관리되는 트랜잭션 처리를 적용할 수 있다.

→ 전형적인 횡단 관심사(AOP 적용 대상) 이다.

편리한 MVC 구조

  • 스프링은 자체적으로 MVC 프레임워크를 제공한다.
  • 덕분에 컨트롤러, 뷰 처리 등에서 불필요한 코드를 줄일 수 있고,
  • 정해진 패턴에 맞춰 개발을 진행할 수 있다.

WAS에 종속적이지 않음

  • 특정한 웹 서버(WEB)에 묶이지 않는다.
  • Tomcat, Jetty 등 어떤 WAS 위에 올려도 동작한다.
  • 또한 서버 없이도 단위 테스트를 수행할 수 있어 개발 속도가 빨라진다.

IoC (Inversion of Control, 제어의 역전)

  • 기존 방식(개발자가 직접 제어):
    • 객체 생성
    • 객체 간 연결
    • 객체 생명주기 관리
    • 등을 모두 개발자가 직접 제어한다.
  • IoC 관점에서는 객체의 입장에서 보면,
    • 사용할 다른 객체를 직접 생성하거나 제어하지 않고
    • 자기 자신이 어디에서 사용되는지도 알지 못한다.
  • 어떤 객체가 생성되고 어떻게 연결될지는
  • 스프링 컨테이너와 같은 특별한 권한을 가진 다른 객체에 의해 결정된다.

→ 이런 흐름의 변화를 제어의 역전(IoC) 이라고 한다.

IoC 컨테이너

  • 스프링에서 객체 생성, 관리, 의존성 주입(DI) 을 담당하는 핵심 컴포넌트이다.
  • IoC 컨테이너는 개념적으로는 논리적인 구조이며,
    • BeanFactory : 가장 기본적인 IoC 컨테이너 기능 제공
    • ApplicationContext : BeanFactory를 확장한 형태로, 더 많은 부가 기능 제공
  • 실제 구현 객체로는 다음과 같은 것들이 있다.

DI / IoC / AOP / POJO

  • DI : 객체 간 연결(의존성 주입) 은 스프링이 담당한다.
  • IoC : 객체의 생성 / 관리 또한 스프링이 담당한다.
  • AOP : 중복되는 공통 기능(횡단 관심사) 은 따로 모아서 필요한 지점에 자동으로 끼워 넣는다.
  • POJO : 특별한 규칙에 묶이지 않은 평범한 자바 코드(순수 자바 객체) 로 개발한다.

Lombok 어노테이션

  • 클래스에 어노테이션을 붙여서 자주 사용하는 Getter/Setter 메소드, 생성자, toString 등을 자동으로 만들어 주는 라이브러리이다.
  • 회원 관리 같은 기능을 만들 때 엔티티 클래스나 DTO 클래스를 사용하면,
  • 원래는 모든 필드에 대해 Getter/Setter를 직접 작성해야 한다.
  • Lombok을 사용하면 이런 반복 코드를 자동으로 생성해 주기 때문에 소스코드를 더 짧고 간결하게 만들 수 있다.

엔티티(Entity)와 DTO의 역할

엔티티(Entity) 클래스

  • 데이터베이스 테이블과 1:1로 매핑되는 클래스
  • DB에 데이터를 저장하고 조회하기 위해 사용한다.

DTO(Data Transfer Object) 클래스

  • DB에서 조회한 데이터나 화면에서 입력받은 데이터를
  • 계층 간에 전달하고 관리하기 위한 클래스이다.
  • Controller ↔ Service ↔ Repository 사이에서 데이터 이동에 사용.

자주 사용하는 Lombok 어노테이션

  • @Getter
  • @Setter
  • @Builder
  • @Data 

이 어노테이션들을 사용하면

반복적으로 작성해야 하는 보일러플레이트 코드 (getter, setter, toString 등)를 자동으로 생성해 준다.

어노테이션 기능 특징 주로 사용하는 곳(클래스 종류)
@Getter 모든 필드에 대한 getter메소드 자동생성클래스에 붙이면 전체 필드에 적용 읽기 전용 필드를 만들 때 유용함 DTO, VO, Entity, Service, Controller(필요시)
@Setter setter 자동생성 변경 가능 상태를 만들기 때문에 주의필요 DTO/VO(자주사용), Entity(거의 사용하지 않음)
@ToString toString 자동생성 디버깅/로그용으로 유용 DTO, VO, 테스트용 클래스
@RequiredArgsConstructor final/@NonNull필드만 생성자에 포함 의존성 주입 패턴에 적합 Service, Controller, Component 클래스
@AllArgsConstructor 모든 필드를 파라미터로 받는 생성자 DTO 생성 편리 DTO, VO
@NoArgsConstructor 기본 생성자 생성 JPA Entity에서 필수 Entity, DTO(기본 생성자 필요시)
@Data Getter, Setter, ToString, EqualsAndHashCode, RequiredArgsConstructor DTO/VO 한번에 구성 DTO, VO / Entity는 사용 비추천
@Builder 빌더 패턴 자동 생성 객체생성 가독성 향상, 선택적 필드설정가능 DTO, VO, Entity 생성 메소드, 서비스 계층
@Slf4j log 필드 자동 생성 Logger 코드 불필요 Controller, Service, Repository, 테스트 클래스
@EqualsAndHashCode equals(), hashCode() 자동생성 비교할 객체가 있을 때 유용 DTO, VO, Entity(특정 필드만 비교할 때)
  • DTO/VO 만들 때 -> @Data 또는 @Getter + @Setter + @ToString
  • Entity 만들 때 -> @Getter + @NoArgsConstructor + @Builder
  • Service/Controller에서 DI(의존성 주입) 사용 시 -> @RequiredArgsConstructor
  • 생성자를 다양하게 사용해야 할 때 -> @AllArgsConstructor, @NoArgsConstructor
  • 객체 생성 방식을 깔끔하게 하고 싶을 때 -> @Builder
  • 로그 출력이 필요한 클래스에서 -> @Slf4j

스프링부트 회원가입 로그인

처음 spring project를 만들때 선택한 dependency리스트

프로젝트 구조

  • src/main/java 백엔드 자바 코드
    • com.example.finalapp 프로젝트의 루트 패키지 FinalappApplication.java 스프링 부트 시작점(Main Class)
    • com.example.finalapp.controller 요청을 받고 응답을 넘기는 계층 UserController.java 브라우저(사용자) 요청을 받음, 서비스(Service)호출, 결과를 HTML 페이지(View)로 전달 /user/join, /user/login 같은 URL 처리
    • com.example.finalapp.dto 데이터 전달 객체 UserDTO.java 사용자 입력 데이터와 결과 데이터를 담는 객체 Controller<->Service<->View 사이에서 이동 ex) 회원가입 시 form데이터를 UserDTO로 받음
    • com.example.finalapp.repository DB와 직접 연결하는 계층 JdbcUserRepository.java DB와 통신, SQL 실행, 데이터를 저장/조회/수정/삭제 처리 => 실제 DB 동작 구현체 UserRepository.java(인터페이스) => DI로 유연하게 구조 구성
    • com.example.finalapp.service 비즈니스 로직 계층(컨트롤러보다 한단계 아래에서 실제 기능을 수행하는 핵심 계층) UserService.java 순수 비즈니스 로직 처리 / Repository 호출 / Controller에서 받은 데이터를 검증하고 로직 수행 UserServiceImpl.java ex) 회원가입, 로그인 검증, 중복 체크 등
  • src/main/resources 뷰 파일 및 설정 파일
    • templates.user 타임리프 HTML 템플릿(회원관련 화면 페이지) join.html 회원가입 폼 login.html 로그인 폼
    • static 정적파일 : css, js, 이미지 css/user/join.css CSS, Javascript, 이미지 파일 저장 css/user/login.css URL 없이 바로 /css/, /js/ 로 접근 가능 js/user/join.js
    • ex) <link rel="stylesheet" href="/css/user/join.css">
    • application.properties 스프링 부트 설정 파일 DB설정, 포트번호, 타임리프 설정, 로그 설정 등을 관리
  • src/test/java JUnit 테스트 코드를 넣는 곳 서비스/레포지토리 단위 테스트 작성

' > Spring' 카테고리의 다른 글

3. MVC패턴을 이용한 로그인 회원가입 구  (1) 2025.12.12
2. Spring으로 MVC패턴 구축하기1  (0) 2025.12.09
0. SpringBoot  (1) 2025.12.04