Controller:
사용자의 요청값을 저장한 dto를 최초에 만나는 역할, 사용자 요청을 받아서 처리하는 "입구" 역할
Service 에 요청을 전달하고 결과를 사용자에게 반환
Rest api를 만든다면, http 요청을 처리하는 역할
domain:
실제 데이터베이스와 매핑되는 객체
테이블을 정의하는 역할
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(nullable = false, unique = true)
private String email;
private String password;
}
dto: Controller ↔ Service ↔ Repository 간 데이터 전달 역할
예제)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MemberRequestDto {
private String name;
private String email;
private String password;
}
repository: 데이터베이스에 최종적으로 저장하는 역할
- 실제 데이터베이스와 연결되어 CRUD 작업을 수행
- JPA(Hibernate)를 사용하여 엔티티를 저장, 조회, 삭제
예제)
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email);
}
findByEmail() 같은 메서드를 선언하면 JPA가 자동으로 쿼리 생성
@Repository 어노테이션을 붙이면, Spring이 자동으로 관리
service:
Controller의 요청을 받는 역할 데이터베이스와의 상호작용을 Repository를 통해 수행
Spring Boot 흐름 예시
1️⃣ 사용자가 회원 가입 요청을 보냄 (POST /members)
2️⃣ Controller → 요청을 받아 DTO로 변환 후 Service로 전달
3️⃣ Service → 비즈니스 로직 수행 후, Repository에 저장 요청
4️⃣ Repository → 데이터베이스에 저장 (save())
5️⃣ Service → Controller로 결과 반환
6️⃣ Controller → 사용자에게 응답(Response) 반환
- Domain
package org.example.chatproject.member.domain;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(nullable = false, unique = true)
private String email;
private String password;
//enum의 값을 슷자값으로 넣겠다. // 찾아보기!!
@Enumerated(EnumType.STRING)
@Builder.Default
//입력을 안하면 Role,User 로 사용하겠다.
private Role role = Role.USER;
}
Spring Boot + JPA (Java Persistence API) 환경에서 데이터베이스 테이블과 연결되는 엔티티(Entity) 클래스를 정의하는 코드
@Entity를 사용해서 데이터베이스 테이블을 객체처럼 사용할 수 있다.
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Member {
- @Entity
- 이 클래스를 데이터베이스의 테이블과 연결할 것이라고 JPA에 알려줌.
- 이 클래스가 member라는 이름의 테이블과 매핑
- @Builder
- 객체를 생성할 때 편리하게 만들 수 있는 기능을 제공해. new 키워드를 사용하지 않아도 사용할 수 있다.
- 예를 들어 아래처럼 Member 객체를 쉽게 만들 수 있다.
있을 경우,
Member member = Member.builder()
.name("홍길동")
.email("hong@example.com")
.password("1234")
.build();
없을 경우,
Member member = new Member("홍길동", "hong@example.com", "1234");
- @AllArgsConstructor
- 모든 필드를 포함한 생성자를 자동으로 생성해 줌.
없을경우
- 모든 필드를 포함한 생성자를 자동으로 생성해 줌.
public Member(Long id, String name, String email, String password, Role role) {
this.id = id;
this.name = name;
this.email = email;
this.password = password;
this.role = role;
}
- @NoArgsConstructor
- 기본 생성자(매개변수가 없는 생성자)를 자동으로 생성해 줌.
- @Getter
- 모든 필드의 getter 메서드(값을 가져오는 메서드)를 자동 생성해 줌.
- 예를 들어, member.getName()을 호출하면 name 값을 가져올 수 있음.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- @Id
- 이 필드가 Primary Key(기본 키) 라는 걸 의미
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- 자동 증가(AUTO_INCREMENT) 전략을 사용하겠다는 뜻.
- 즉, id 값이 자동으로 증가됨.
- 예를 들어, 첫 번째 회원(id=1), 두 번째 회원(id=2)처럼 자동 증가
@Override
public Member save(Member member) {
member.setId(++sequence); // 회원 ID 자동 증가
store.put(member.getId(), member); // store(Map)에 저장
return member; // 저장한 회원 반환
}
이것도 자동증가하는 코드인데 뭐가 다르지?
@GeneratedValue(strategy = GenerationType.IDENTITY) : Jpa에서 자동으로 ID를 증가하는 방식
즉, ID값을 우리가 직접 설정할 필요가 없다.
member.setId(++sequence); : 수동으로 증가하는 방식, 메모리에 직접 저장하는 방식이기 때문에 데이터베이스 없이도 동작한다.
하지만 HashMap 같은 메모리 저장소에서만 동작하는 방식이다. 그래서 서버가 재시작되면 sequence 값이 초기화됨!
@Entity | JPA에서 DB 테이블과 연결 | JPA가 자동으로 테이블을 생성하고 관리 |
@Builder | Builder 패턴 지원 | 객체를 깔끔하게 생성 가능 (가독성↑) |
@AllArgsConstructor | 모든 필드를 받는 생성자 자동 생성 | 객체를 쉽게 생성할 수 있음 |
@NoArgsConstructor | 기본 생성자 자동 생성 | JPA가 객체를 생성할 때 필요 |
@Getter | 모든 필드의 getter 자동 생성 | 외부에서 값 읽기 가능 |
'아무거나 공부' 카테고리의 다른 글
[HTTP] HTTP API에 대해서 (0) | 2025.03.15 |
---|---|
[프로젝트] 채팅방만들기 - 회원가입구현 (0) | 2025.03.13 |