hello-spring/
├─ src/main/java/hello/hellospring/
│  ├─ HelloSpringApplication.java      // 스프링 부트 시작점
│  ├─ domain/                          // 순수 데이터(엔티티)
│  │  └─ Member.java
│  ├─ repository/                      // 저장소(메모리/JDBC/JPA 등)
│  │  ├─ MemberRepository.java
│  │  ├─ MemoryMemberRepository.java
│  │  ├─ JdbcTemplateMemberRepository.java   
│  │  ├─ JpaMemberRepository.java            
│  │  └─ SpringDataJpaMemberRepository.java  
│  ├─ service/                         // 핵심 로직
│  │  └─ MemberService.java
│  ├─ controller/                      // 웹(컨트롤러)
│  │  ├─ HelloController.java          
│  │  ├─ HomeController.java           
│  │  └─ MemberController.java         
│  ├─ aop/                             // 공통 관심사(시간 측정...)
│  │  └─ TimeTraceAop.java
│  └─ SpringConfig.java                // 수동 빈 등록(선택)
└─ src/main/resources/
   ├─ static/hello-static.html         // 정적 페이지
   ├─ templates/
   │  ├─ hello-template.html           // MVC 템플릿
   │  ├─ home.html                     // 홈
   │  └─ members/
   │     ├─ createMemberForm.html      // 등록 폼
   │     └─ memberList.html            // 목록
   ├─ application.properties           // DB/JPA/H2 설정
   └─ sql/ddl.sql                      // 테이블 생성 스크립트

MVC + Thymeleaf(템플릿 엔진)

Controller가 데이터를 Model에 담고, View를 반환하면, 템플릿 엔진이 렌더링해서 브라우저에 보여준다.

@Controller
public class HelloController {

    @GetMapping("hello-mvc")
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template";
    }
}

@ResponseBody

View(Html)를 사용하지 않고, Http 응답 바디에 직접 데이터를 넣어서 보낸다.

@Controller
public class HelloController {

    @GetMapping("hello-string")
    @ResponseBody
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }
}

http://localhost:8080/hello-string?name=spring 실행하면 “hello spring” 내용이 나온다.


Domain (Entity)

package hello.hellospring.domain;

public class Member {
    private Long id;     // 시스템이 관리할 식별자
    private String name; // 사용자가 입력하는 이름

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

단순히 id, name만 가진 순수 자바 객체이다.

DB, JPA로 넘어가면 여기에 @Entity 등이 붙음.


Repository (Interface)

<MemberRepository.java>