그저 내가 되었고

🌱Spring 프로젝트 설계 순서 본문

개발/Spring

🌱Spring 프로젝트 설계 순서

hyuunii 2023. 4. 19. 11:03

개인 공부 정리용

틀린 정보 있을 확률이 적지 않습니다

 

 

❨❨설계 순서❩❩

entity -> dto -> repo ->  service -> controller

 

 

 

❨❨계층 설계 예시❩❩

1. Repository

- Product: 관심 상품 테이블(얘만 db에 저장됨)

- ProductRepository: 관심 상품 조회, 저장

- ProductRequestDto: 관심 상품 등록하기

- ProductMypriceRequestDto: 관심 가격 변경하기

- ItemDto: 검색 결과 주고받기

 

2. Service

- ProuctService: 관심 상품 가격 변경

 

3. Controller

- ProductRestController: 관심 상품 컨트롤러

- SearchRequestController: 검색 관련 컨트롤러

 

 

 

❨❨API 흐름도❩❩

6) controller/ProSurveyController.java

||

4) model/service/EmergencySurveyDomainService.java

(getEmergencySurvey, save)

(Model/service 자주 사용되는 함수를 별도로 관리하기 위한 model 전용 service)

 

5) service/EmergencySurveyService.java

||

2) dto/survey/EmergencyRegisterSurvey.java

(EmergencyInformation & EmergencyContents)

||

2) dto/request/UpdateEmergencySurveyRequest.java

||

 

3) model/repository/EmergencySurveyRepository.java

( 테이블에 매핑되는 객체. 해당 레포에서 정의된 쿼리로 spring data jpa 사용)

(var patientInfo = patientRepository.findById(patientId);

2) dto/response/GetEmergencySurveyResponse.java

2) dto/response/UpdateEmergencySurveyResponse.java

1) model/dao/EmergencySurvey.java

 

 

 

스프링 CRUD 흐름 정리❩❩

 

1. 폼에서 DB 커넥션 / MYSQL / MYBATIS LIB 적용

 

2. MYSQL DB 생성

 

3. root-context.xml에서 DB 연결 설정

 

4. DB기초공사(Mybatis-config.xml  mapper.xml 생성)

 

5. VO 생성(VO (Value Object) : DB의 정보를 객체화 시키는 용도)

 

6. Mapper.xml 작성

 

7. DAO Interface/DAOImpl 작성 (DAO (Data Access Object) : 데이터 접근 객체 )

   서비스 <-> DAO <-> Mapper

 

8. service / serviceImpl 작성 (Service : 유지보수와 로직프로세스를 유연하게 처리하기 위한 중간 단계.)

   (controller -> service(interface) -> ServiceImpl -> dao)

 

9. 게시판 목록 페이지 구현 (list.jsp(jstl) -> boardController)

 

10. 등록 페이지 구현 (regist.jsp -> boardController(get / post 두가지 방식 구현)

    (post service호출/redirect 호출 : 글쓰기 작업 완료 후 DB 전송 및 list.jsp에 구현)

 

11. 조회 페이지 구현 (read.jsp -> boardController)

 

12. 수정/삭제 페이지 구현 (modify.jsp -> boardController (get/post방식)  / 삭제 작성(post방식))

 

 

 

❨실제 프로젝트 설계 예시❩❩

회사 코드로 공부하다가 블로그로 옮겨 적으면서 클래스 이름, 객체 이름 등을 마구 수정해서(..) 이대로 하시면 굴러가지 않을 확률이 매우매우매우 큽니다!!!!

 

1. model - dao

@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@EntityListeners(AuditingEntityListener.class)
@Table(name = "pickmin_friends")
public class pickminFriends {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long surveyUuid;
    Long userId;
    String contents;

    @CreatedDate
    LocalDateTime createAt;

    @LastModifiedDate
    LocalDateTime updateAt;
}
create table pickmin_friends
(
    survey_uuid bigint auto_increment
        primary key,
    user_id     bigint       null,
    contents    varchar(500) null,
    update_at   datetime     null,
    create_at   datetime     null
)

 

 

2. dto - pickminFriends

 

@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class pickminFriends {
    String name; 
    String level
    String location;
    String pickmins;
}

 

 

3. dto - request - UpdatePickminFriendsRequest(얘가 포스트 바디로 들어온다)

@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UpdatePickminFriendsRequest {
    Long userId;
    PickminFriends pickminFriends;  //이게 위의 dto-pickminFriends
}

 

 

4. dto - response - GetPickminFriendsResponse

@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class GetPickminFriendsResponse {
    Integer rc;

    Long userId;
    Long uuid;

    FriendDetailInfo friendDetailInfo;
    PickminFriends pickminFriends;

    LocalDateTime updateAt;
}

 

 

5. dto - response - UpdatePickminFriendsResponse

@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UpdatePickminFriendsResponse {
    Integer rc;
    Long uuid;

 

 

6. model - repository - PickminFriendsRepository

@Repository
public interface UpdatePickminFriendsRequest extends JpaRepository<PickminFriends, Long> {
    Optional<PickminFriends> findByUserId(Long accountId);
}

 

 

7. model - service - PickminFriendsDomainService

@Service
@AllArgsConstructor
public class PickminFriendsDomainService {
    private final PickminFriendsRepository pickminFriendsRepository;

    public Optional<pickminFriends> getPickminFriends(Long accountId) {
        return pickminFriendsRepository.findByUserId(accountId);
    }

    public pickminFriends save(pickminFriends data) { 
        return pickminFriendsRepository.save(data);
    }
}

 

 

 

8. service - PickminFriendsService

 

 

 

9. controller - FriendsController