Open kkn1125 opened 2 years ago
프론트에 생성하는 객체는 데이터를 주고 받는 그릇으로 활용하기 위해 생성. 공통으로 사용하는 함수를 개발해야 api개발에 사용할 때 편의성을 증대 시킬 수 있다. 유지보수성을 높히기 위한 이유도 포함.
interface Model을 의미한다.
interface로서 모든 클래스에 필요한 공통의 함수명과 인자, 반환 값을 지정한다.
extends 하여 사용하기 위한 클래스로 공통으로 타입에 관계없이 사용할 수 있도록 확장하여 활용하기 위한 목적으로 만들어졌다.
// IModel과 PModel을 상속한 예시 코드 class User extends PModel implements IModel { private nickName: ModelStringValue; //... public set(column: UserColumn, value: ModelValue) { // ... } }
api는 아래 규칙을 따른다.
const findUserAll () { /* ... */ } const findUserById (id: string) { /* ... */ } const findDiaryByUid (uid: string) { /* ... */ } const insertUser (user: User) { /* ... */ } const updateUser (user: User) { const formData = user.makeFormData(); return axios.put('/api/user', formData) .then(handleReceiveData) .catch(handleReceiveError); } const deleteUserById (id: string) { /* ... */ }
객체 update에 필요한 함수 replaceIfNotNull 내용은 아래와 같다.
public class Entity<T> { public T replaceIfNotNull(T compare) { List<Field> fields = Arrays.asList(this.getClass().getDeclaredFields()); fields.forEach(field -> { try { field.setAccessible(true); Object compareField = field.get(compare); Object thisField = field.get(this); if (field.getName() == "userAuth") { field.set(this, "USER"); } else { field.set(this, compareField != null ? compareField : thisField); } } catch (IllegalAccessException e) { System.out.println("The value is null [" + field.getName() + "]"); } }); return (T) this; } } // 사용 예시 public class User extends Entity<User> implements UserDetails { // ... }
리파지토리 명칭은 ClassNameRepository로 한다.
config디렉토리 MongoAuditConfig에 지정해두었기 때문에 @Repository는 달지 않는다.
ClassNameRepository : interface
ClassNameRepositoryCustom : interface - 커스터마이징 구현 함수 설정
ClassNameRepositoryCustomImpl : class - 커스터마이징 구현 함수 작성 (MongoTemplate를 생성자 주입으로 사용하는 것을 원칙으로 한다.)
기본적으로 단순한 findAll, findById, insert, deleteById는 ClassNameRepository에서 사용하고, 쿼리문이 필요한 함수만 커스터마이징하여 사용한다.
함수 명칭은 ClassNameRepositoryCustomImpl, ClassNameService, ClassNameRestController 모두 동일하게 처리한다. 예를 들면 다음과 같다.
// DiaryRepositoryCustomImpl class DiaryRepositoryCustomImpl implements DiaryRepositoryCustom { private MongoTemplate diaryTemplate; @Autowired DiaryRepositoryCustomImpl(MongoTemplate diaryTemplate) { this.diaryTemplate = diaryTemplate; } public Optional<User> findByUid (String uid) { Criteria cr = new Criteria("uid").is(uid); Query q = new Query(cr); return diaryTemplate.findOne(q, Diary.class); } } // DiaryService @Service class DiaryService { private DiaryRepository diaryRepository; @Autowired DiaryRepositoryCustomImpl(DiaryRepository diaryRepository) { this.diaryRepository= diaryRepository; } public User findByUid (String uid) { return diaryRepository.findByUid(uid).orElseThrow(); } } // DiaryRestController @RestController @RequestMapping("/api") class DiaryRestController { private DiaryService diaryService; @Autowired DiaryRepositoryCustomImpl(DiaryService diaryService) { this.diaryService= diaryService; } private String mapper(Object object) throws JsonProcessingException { return new ObjectMapper().writeValueAsString(object); } @GetMapping("/user/uid/{uid}") public String findByUid (@PathVariable("uid") String uid) throws JsonProcessingException { return mapper(diaryService.findByUid(uid)); } }
파일 삭제 내용 #97 참조
FE/BE 코드 규칙 설정
공통 사항
FE 공통 규칙
프론트에 생성하는 객체는 데이터를 주고 받는 그릇으로 활용하기 위해 생성. 공통으로 사용하는 함수를 개발해야 api개발에 사용할 때 편의성을 증대 시킬 수 있다. 유지보수성을 높히기 위한 이유도 포함.
Model
IModel의 개념
interface Model을 의미한다.
interface로서 모든 클래스에 필요한 공통의 함수명과 인자, 반환 값을 지정한다.
PModel의 개념
extends 하여 사용하기 위한 클래스로 공통으로 타입에 관계없이 사용할 수 있도록 확장하여 활용하기 위한 목적으로 만들어졌다.
API
api는 아래 규칙을 따른다.
BE 공통 규칙
Entity 클래스
객체 update에 필요한 함수 replaceIfNotNull 내용은 아래와 같다.
Repository
리파지토리 명칭은 ClassNameRepository로 한다.
config디렉토리 MongoAuditConfig에 지정해두었기 때문에 @Repository는 달지 않는다.
ClassNameRepository : interface
ClassNameRepositoryCustom : interface - 커스터마이징 구현 함수 설정
ClassNameRepositoryCustomImpl : class - 커스터마이징 구현 함수 작성 (MongoTemplate를 생성자 주입으로 사용하는 것을 원칙으로 한다.)
기본적으로 단순한 findAll, findById, insert, deleteById는 ClassNameRepository에서 사용하고, 쿼리문이 필요한 함수만 커스터마이징하여 사용한다.
Service
함수 명칭은 ClassNameRepositoryCustomImpl, ClassNameService, ClassNameRestController 모두 동일하게 처리한다. 예를 들면 다음과 같다.