카테고리 없음

[TIL] Spring - 실전에 필요한 개념

mooncommit 2026. 4. 8. 23:55

오늘은 튜터님의 말씀을 듣고, 실전 위주 중요 포인트를 공부했다.

To Do List · 2026.04.08

  • 01 Spring Boot 개념
  • 02 IoC / DI
  • 03 Controller → Service → Repository 흐름
  • 04 MVC 패턴
  • 05 주요 어노테이션
  • 06 Lombok
  • 07 Thymeleaf
  • 08 URL 매핑 어노테이션
  • 09 application.properties
  • 10 프로젝트 폴더 구조

 

1. Spring Boot란?


Java로 웹 개발을 쉽게 할 수 있게 만든 프레임워크.

기존 Spring은 설정이 너무 복잡했는데, Spring Boot는 그 복잡한 설정을 자동으로 해준다


요즘 Java 백엔드 개발은 거의 다 Spring Boot로 한다.

 

2. IoC와 DI (Spring의 핵심 원리)


IoC (제어의 역전)

Java에서는 내가 직접 객체를 만들었지만, Spring에서는 Spring이 대신 만들고 관리해준다.

// 🤔 순수 Java 방식 - 내가 직접 객체 생성
UserService userService = new UserService();
userService.doSomething();

// ☺️ Spring 방식 - Spring이 알아서 만들어서 넣어줌
@Autowired
UserService userService;   // 선언만 하면 끝!
 🕶️ Spring이 관리하는 객체를 'Spring Bean'이라고 한다.
 @Component @Controller ,  @Service ,  @Repository  가 붙으면 자동으로 Bean이 된다.

 

DI (의존성 주입)

Spring이 필요한 객체를 자동으로 넣어주는 것. @Autowired를 쓰면 된다.

@Service
public class MemoService {

    @Autowired
    MemoRepository memoRepository;  // Spring이 자동으로 넣어줌

    public List<Memo> getMemos() {
        return memoRepository.findAll();
    }
}

 

3. 전체 흐름 (요청이 들어올 때)


사용자가 URL을 요청하면 이 순서로 처리된다.

다시 역순으로 반환
🕶️ DispatcherServlet은 Spring이 알아서 관리해줌. 개발자는 Controller / Service / Repository만 만들면 된다

 

4. MVC 패턴


애플리케이션을 세 가지 역할로 나눠서 개발하는 방식

 

5. @Controller — URL 요청 처리


사용자의 HTTP 요청을 받아서 처리하는 클래스

@Controller
public class MemoController {

    @Autowired
    MemoService memoService;

    // GET /memos → 메모 목록 조회
    @GetMapping("/memos")
    public String getMemos(Model model) {
        List<Memo> memos = memoService.getMemos();
        model.addAttribute("memos", memos);  // View로 데이터 전달
        return "memo-list";                  // memo-list.html 렌더링
    }

    // POST /memos → 메모 저장
    @PostMapping("/memos")
    public String createMemo(@RequestParam String contents) {
        memoService.createMemo(contents);
        return "redirect:/memos";  // 저장 후 목록으로 이동
    }

    // GET /memos/1 → 특정 메모 조회
    @GetMapping("/memos/{id}")
    public String getMemo(@PathVariable Long id, Model model) {
        Memo memo = memoService.getMemo(id);
        model.addAttribute("memo", memo);
        return "memo-detail";
    }
}
🕶️ @PathVariable은 URL의 {id} 부분을 받고, @RequestParam은 폼에서 입력한 값을 받는다.

 

6. @Service — 비즈니스 로직


실제 기능(비즈니스 로직)을 담당하는 클래스. Controller와 Repository 사이에 위치한다.

@Service
public class MemoService {

    @Autowired
    MemoRepository memoRepository;

    // 전체 메모 조회
    public List<Memo> getMemos() {
        return memoRepository.findAll();
    }

    // 특정 메모 조회
    public Memo getMemo(Long id) {
        return memoRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("메모 없음"));
    }

    // 메모 저장
    public void createMemo(String contents) {
        Memo memo = new Memo(contents);
        memoRepository.save(memo);
    }

    // 메모 삭제
    public void deleteMemo(Long id) {
        memoRepository.deleteById(id);
    }
}

7. @Repository — DB 접근


DB에서 데이터를 조회하고 저장하는 역할. JpaRepository를 상속받으면 기본 CRUD가 자동으로 생긴다!

@Repository
public interface MemoRepository extends JpaRepository<Memo, Long> {

    // ✅ 자동 제공되는 메서드:
    // findAll()           → 전체 조회
    // findById(id)        → id로 조회
    // save(memo)          → 저장/수정
    // deleteById(id)      → 삭제
    // count()             → 개수 세기
    // existsById(id)      → 존재 여부 확인

    // 필요하면 직접 추가도 가능:
    List<Memo> findByContentsContaining(String keyword);
}
🕶️ 인터페이스만 만들면 Spring이 구현체를 자동으로 만들어줌. 직접 SQL 안 써도 된다!

8. @Entity — DB 테이블 매핑


이 클래스가 DB 테이블과 1:1로 연결된다는 표시. JPA가 자동으로 테이블을 만들어준다.

@Getter                          // getter 자동 생성 (Lombok)
@Entity                          // DB 테이블과 연결
@Table(name = "memos")           // 테이블 이름 지정
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Memo {

    @Id                          // Primary Key
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // AUTO_INCREMENT
    private Long id;

    @Column(nullable = false, length = 100)
    private String contents;

    public Memo(String contents) {
        this.contents = contents;
    }
}
🕶️ @NoArgsConstructor(access = AccessLevel.PROTECTED)
JPA는 빈 생성자가 필요하지만 public으로 열면 불완전한 객체가 만들어질 수 있어서 protected로 막는다.

 

9. Lombok — 반복 코드 자동 생성


매번 getter/setter/생성자를 직접 쓰는 게 귀찮으니까 어노테이션 하나로 자동 생성해주는 도구

@Builder 예시

@Builder
@Getter
public class Memo {
    private Long id;
    private String contents;
}

// 사용할 때 - 필요한 것만 골라서 설정 가능
Memo memo = Memo.builder()
        .id(1L)
        .contents("오늘 할 일")
        .build();

 

10. Thymeleaf — View 화면 만들기


서버에서 HTML을 동적으로 만들어주는 템플릿 엔진. Controller에서 보낸 데이터를 HTML에 채워준다.

Controller에서 데이터 보내기

@GetMapping("/memos")
public String getMemos(Model model) {
    List<Memo> memos = memoService.getMemos();
    model.addAttribute("memos", memos);      // "memos" 이름으로 데이터 전달
    model.addAttribute("title", "메모 목록");
    return "memo-list";  // templates/memo-list.html 렌더링
}

memo-list.html에서 데이터 받기

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>

    <!-- ${변수명}으로 데이터 꺼내기 -->
    <h1 th:text="${title}">기본 제목</h1>

    <!-- th:each로 리스트 반복 -->
    <ul>
        <li th:each="memo : ${memos}">
            <span th:text="${memo.id}">id</span>.
            <span th:text="${memo.contents}">내용</span>
        </li>
    </ul>

    <!-- th:if로 조건문 -->
    <p th:if="${memos.isEmpty()}">메모가 없어요!</p>

    <!-- 폼에서 데이터 전송 -->
    <form th:action="@{/memos}" method="post">
        <input type="text" name="contents" placeholder="메모 입력">
        <button type="submit">저장</button>
    </form>

</body>
</html>

 

11. URL 매핑 어노테이션


@Controller
public class MemoController {

    @GetMapping("/memos")          // GET  /memos      → 목록 조회
    @PostMapping("/memos")         // POST /memos      → 저장
    @GetMapping("/memos/{id}")     // GET  /memos/1    → 단건 조회
    @DeleteMapping("/memos/{id}")  // DELETE /memos/1  → 삭제
}

 

12. application.properties — 설정 파일


DB 연결, JPA 설정 등 앱 전반적인 설정을 하는 파일. 위치: src/main/resources/application.properties

# ===== MySQL 연결 설정 =====
spring.datasource.url=jdbc:mysql://localhost:3306/데이터베이스명?useSSL=false
spring.datasource.username=root
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# ===== JPA 설정 =====
spring.jpa.hibernate.ddl-auto=update        # 테이블 자동 생성/수정
spring.jpa.show-sql=true                    # 실행 SQL 콘솔에 출력
spring.jpa.properties.hibernate.format_sql=true  # SQL 예쁘게 출력

# ===== Thymeleaf 설정 =====
spring.thymeleaf.cache=false  # 개발 중에는 false (수정 즉시 반영)
🕶️ ddl-auto=update → 코드 변경 시 테이블 자동으로 업데이트. 개발할 때 편리하다!

 

13. 어노테이션 총정리


 

14. 초보자를 위한 Spring Boot 개발 순서


과제나 실습을 할 때 어떻게 시작해야 할지 막막해서 쉽게 접근할 수 있는 방법을 찾아봤다.


  1단계    Entity 만들기 (데이터 구조 설계)

  • DB 테이블과 연결될 자바 객체를 가장 먼저 만든다.
  • "내가 어떤 데이터를 다룰 것인가" 정해져야 그 다음 단계가 진행 (메모 제목, 내용, 작성자 등)

  2단계    Repository 만들기 (DB 통로 확보)

  • Entity를 DB에 저장하고 불러올 인터페이스를 만든다.
  • JPA를 상속받기만 하면 save(), findAll() 같은 강력한 기능을 바로 쓸 수 있는 '도구'가 생기는 단계이다.

  3단계    Service 만들기 (비즈니스 로직 구현)

  • 핵심 기능을 코딩한다.
  • Repository라는 도구를 활용해 실제로 "메모를 수정한다", "리스트를 역순으로 보여준다" 같은 알맹이 기능을 만드는 과정

  4단계    Controller 만들기 (사용자 연결)

  • 브라우저 요청(URL)을 받아 서비스와 연결해 준다.
  • 앞서 만든 기능들을 사용자가 실제로 클릭하거나 접속해서 사용할 수 있게 문을 열어주는 최종 단계이다.

TODAY POINT

🍬 Spring은 어노테이션만 잘 붙이면 나머지는 알아서 해준다.

🍬 Controller → Service → Repository 이 흐름만 머릿속에 넣으면 과제 시작 가능.

🍬 어려운 게 당연하다.

 

🐹 오늘 학습을 마치며 🐼

스프링은 처음 접하다 보니  @ 어노테이션  들도 낯설고 종류도 많아서 막막하게 느껴졌다.

하지만 튜터님께서 “원래 배울 것이 많고 시간이 오래 걸리는 분야지만, 지금은 실습과 실무에 필요한 부분 위주로 학습하면 된다”고

말씀해 주셔서 방향을 잡을 수 있었다. 정말 다행이다 ꒰⍢꒱ ༘*

 

모든 내용을 이해하려 하다가, 꼭 필요한 핵심에 집중하자고 생각하니 학습 범위가 정리되는 느낌이었다.

Spring의 핵심은 'Controller → Service → Repository' 이 세 가지인 것 같다. 확실히 학습하고 넘어갈 것이다⎝⍥⎠

내일은 이 흐름 속에서 각 계층이 어떤 역할을 하고, 어떤 요소들로 구성되는지 더 구체적으로 학습해볼 예정이다.

 

스프링을 접한 지 이제 이틀째인 만큼 조급해하지 않고 차근차근 익혀나가면서,

내일부터는 본격적으로 과제에도 도전해볼 생각이다. 화이팅! 😎🔥