아무거나 공부

[프로젝트] 채팅방만들기 - 도메인구성

songsua 2025. 3. 3. 19:31



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