이제 프로젝트를 만들고, MySql 설정, 연동까지 끝냈으니 본격적인 백엔드 로직을 작성할 차례이다. 하지만 그 전에 앞서, 준비해야 할 것이 있다.
먼저는 프로젝트에 필요한 API주소와 method, 기능을 임시로 작성해 보는 것이다.
그래서 앞서 만들어 보았던 figma 스토리보드를 보면서 어떤 데이터가 필요할지 생각해 보고, 다음과 같이 url을 임시로 작성해 보았다.🔽 RestAPI EndPoint
METHOD URI 기능 POST /users 회원가입 POST /users/login 로그인 GET /users/{userId} User객체 반환 PUT /users/{userId} 회원정보수정 DELETE /users/{userId} 회원탈퇴 GET /users/duplicated/{parameter} 아이디, 별명, 전화번호 중복체크 GET /users/my_list/{userId}/{parameter} 친구 초대 리스트, 약속 초대 리스트 PUT /users/{param}/{userId} 별명, content 정보수정 GET /users/search/invite/{userId}/{appointId}{postId} 약속에 초대할 유저 검색 POST /upload/upload 프로필 업로드 GET /upload/{userId} 프로필 불러오기 POST /appoints/{userId} 약속 만들기 GET /appoints/{userId}/{appointId} 약속 가져오기 PUT /appoints/{appointId}/{userId} 약속 수정 DELETE /appoints/{userId}/{appointId} 약속 삭제 GET /appoints/members/{appointId} 멤버 별명 가져오기 DELETE /appoints/members/{appoint_id}/{from_id}/{to_id} 약속 멤버 강퇴 GET /appoints/search/{is_public}/{is_recruit}/{page} 약속 최대인원 수정 PUT /appoints/setCount/{appoint_id}/{user_id}/{count} 약속 멤버 강퇴 GET /appoints/list/{userId}/{page} 내약속목록 가져오기 DELETE /friends/{friendId} 친구초대 거절 POST /friends/ 친구초대 보내기 POST /friends/accept/{friendId} 친구초대 수락 GET /friends/list{userId} 친구목록 DELETE /invites/{inviteId} 약속초대 거절 POST /invites//{appointId}/{fromId}/{toId} 초대보내기 GET /messages/list/{userId} 쪽지 목록 DELETE /messages/{userId} 쪽지 삭제 POST /messages 쪽지 보내기 GET /myAppoints/is_master/{userId}/{appointId} 방장 여부 POST /myAppoints/{userId}/{appointId} 약속 참가 DELETE /myAppoints/{userId}/{appointId} 약속 나가기
이제 이 주소대로, 기능대로 컨트롤러와 서비스, 레포지토리를 작성하면 된다. (하지만 말 그대로 구상일 뿐이며, 프로젝트 진행 중 변경된 사항도 있다.)
그러면 작성하기 이전에 코드가 들어갈 폼을 각자 만들어 보기로 하자.
먼저, 다음과 같이
EnableJpaAuditing
을SpringBootApplication
어노테이션이 있는main
함수에 적용시키자.Application.class
@SpringBootApplication @EnableJpaAuditing public class SekkisonApplication { public static void main(String[] args) { SpringApplication.run(SekkisonApplication.class, args); } }
EnableJpaAuditing
어노테이션은 엔티티의createAt/updateAt
을BaseEntity
에서 따로 관리하기 위해 적용하였다.
우리 프로젝트에서는 다음과 같이 각각의 엔티티마다 컨트롤러, 서비스, 레포지토리가 존재한다.
해야 할 것은 이 파일들에 코드를 넣기 전에 폼을 미리 만들어 놓는 것이다. (BaseEntity
는 뒤에 설명하도록 하겠다.)Entity
@Entity @Table(name = "tests") @Data @Builder @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper=false) public class Test extends BaseEntity { }
Controller
@RestController @RequestMapping("/tests") @RequiredArgsConstructor public class TestController { private final TestService testService; }
@RequiredArgsConstructor
를 사용하면final
로 설정된 변수들을 Spring bean에서 자동으로 주입해 준다.Repository
public interface TestRepository extends JpaRepository<Test, Long> { }
레포지토리는 인터페이스이다.
Service
@Service @Transactional @RequiredArgsConstructor public class TestService { private final TestRepository testRepository; }
마찬가지로
final
로 자동주입받는다.
이제 각 테이블 별로 폴더를 만들고 그 안에 형식에 맞추어 4개의 파일을 넣도록 하자. 위 코드들의
tests
또는Test
부분만 수정하면 될 것이다.
참고로 우리 프로젝트에서는 코드의 반복을 줄이고 유지보수를 위해
BaseEntity
를 만들어 놓았다. 이 클래스는common
이라는 폴더 안에 있으며,createAt
과updateAt
을 관리한다.
BaseEntity
@Data @MappedSuperclass @EntityListeners(value = AuditingEntityListener.class) public class BaseEntity { @CreatedDate @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") @JsonProperty("create_at") private LocalDateTime createAt; @LastModifiedDate @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") @JsonProperty("update_at") private LocalDateTime updateAt; }
이제 이 클래스를 필요한 곳에
extends
하면 될 것이다.
URL을 설정해 보고, 프로젝트 코드 작성을 위한 기본 폼을 만들어 보았다. 다음 게시글에서 작성 방법과 API를 위한 Response 클래스에 대해 적어보도록 하겠다.