| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 객체지향
- 자연어처리
- ASR
- RDBMS
- 머신러닝
- TTS
- 캐글
- 랭그래프
- 기초
- 에이전트
- 소프트웨어 개발
- Transformer
- 데이터엔지니어
- 생성형 인공지능
- 데이터 시각화
- 정보처리기사
- 딥러닝
- LangGraph
- 힙정렬
- 트랜스포머
- CNN
- 알고리즘
- python 기초
- UMAP
- python기초
- SQL
- CLIP
- Python
- dementional reduction
- RNN
Archives
- Today
- Total
수달이네 기술 블로그
1. SpringBoot 기초 본문
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
스프링부트 회원가입 로그인

프로젝트 구조
- 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 |