본문 바로가기
Project/chatty-potato

[Backend] 스프링 첫 시작

by 블로블로글 2024. 9. 5.

간단한 문답을 주고 받을 수 있는 chatgpt api를 이용한 면접 사이트 개발을 시작했다.

 

우선 앞 선 한 달 정도 동안 매주 한번씩 만나 간단한 기술 검증과 토의를 통해 1차적인 목표를 확립하고 개발을 시작했다.

 

데이터베이스 ERD, dto, 디자인, api

여러가지 토의와 검증을 진행하며, 디자이너 분께서는 동시에 웹 사이트 디자인을 지속적으로 진행해주셨고, 와이어프레임이 빠르게 나왔다. 이를 기반으로 대략적인 검증이 끝낸 후 빠르게 db를 짜고, 프론트 분들과 모여 다같이 api 및 dto를 설계했다.

마지막으로 팀원 분과 프로젝트의 디렉토리 구조와 린트를 같이 고민한 후 적용까지 했다.

물론 아직 모든 컨벤션 관련 논의가 끝나지 않아서 좀 더 많은 고민이 필요했으나 한 분이 취업으로 빠지고, 한 분이 국방의 의무로 시간이 전혀 맞지 않아서 일단은 여기서 만족하기로 했다.

 

이제 드디어 spring 개발의 첫 시작을 할 때가 왔다...!

물론 그 전에 git branch 전략, issue templete, milestone 등등 backend 전반적으로 사용해야할 컨벤션을 아직 정하지 못했지만, 같이 하는 팀원 분의 국방 이슈로 인해 일단 뒤로 미루고 내가 맡기로 한 interview 세션의 기초 작업을 시작하기로 했다.

 

우선 내가 맡기로한 interview의 domain부터 작성하기 시작했다.

package potato.onetake.interview;

import jakarta.persistence.*;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.annotation.Id;

import java.util.Date;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Slf4j
public class interview {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = "true", columnDefinition = "bigserial")
    private long id;

    @Column(length = 255, nullable = false)
    private String title;

    @Column(nullable = false)
    private boolean done;
    private Date created_at;
    private Date updated_at;
    private Date deleted_at;
}

이미 작성되어 있는 db를 살펴보며 작성하던 중에 엔티티들이 다 같이 공통으로 소유하고 있는 column들이 있다는 것을 깨달았다.

이것들을 abstract class로 따로 빼내서 상속 받아서 사용할 수 있지 않을까? 라는 고민을 하게되었다.

 

검색을 해보았고, BaseEntity 구현을 통해서 이를 해결가능하다는 것을 깨달았다.

엔티티에서 따로 빼야할 것들을 정리했다.

id(pk), create,delete,update 컴럼들을 빼서 만들면 될 것 같았다.

package potato.global;

import jakarta.persistence.*;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@MappedSuperclass
@SuperBuilder
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;

}

여기까지 작성하고 난 후 머리가 너무 복잡했다. 우선 global 패키지 안에 meber 추상 클래스를 통하여 작성은 했지만, interview에 적용한 뒤에 이것이 잘 작동하는지에 대한 테스트, 기타 etc... 등등 전반적인 지식이 많이 부족했다.

 

일단 오늘은 같이 백엔드 개발을 진행중인 팀원 분께서 예비군을 가게되셔서 아직 논의되지 않은 세부사항이 많아, 최대한 추후 문제가 되지 않을 부분을 위주로 진행을 했고, 여기서 마무리했다.

 

아마 다음 코어 타임에는 카카오톡으로 팀원분과 계속 이야기하면서 프로젝트 초기 설정을 조금 더 해야할 것 같다.

그리고, 이번 주에는 롬복과 test 코드 작성에 대해서 공부를 해야 할 것 같다.

 

그래도 역시 코드를 치니 뭔가 눈 앞이 보이기 시작했다! 앞으로 조금만 더 힘내자...!

'Project > chatty-potato' 카테고리의 다른 글

[Spring] 도메인형 구조에 대한 고찰  (0) 2024.09.11