현재 진행중인 웹프로젝트시 주의사항들을 적어두자.
예전부터 가지고 있던 생각이었는데 http://kwonnam.pe.kr/wiki/web/신규서비스 를 읽고 난후 적어봐야겟다고 생각해서 적어본다.
위 글에서 나온 내용도 리뷰해서 동의하는 부분은 이 글에 적어볼 생각입니다. 계속 업데이트를 하려고 합니다.
https://teamsmiley.github.io/2017/02/10/code-style/ 이글도 관련이 되있기는 합니다.
전반적인내용
- 유저 모델과 어드민 모델이 다를경우 WithAdmin이라는 걸로 구분한다. 커스텀 미디어타입 , 함수명 클래스명 모두 WithAdmin으로 한다.
frontend
- url은 전부 소문자로 작성한다.(인증시 토큰이 넘어오는데 대소문자를 구분을 한다.)
- type스크립트 사용시 가능하면 any 타입을 줄인다.
- 업데이트시 enter키를 치면 업데이트되게 한다. 엔터를 허용하는 텍스트박스등에서는 ctrl enter로 한다.
backend
- CQRS 상태 변경과 조회는 나누어서 설계하자.
database
-
꼭 상위 - 하위로 나누어야만 하지 않는것도 있다 예를들면 게시글은 게시판 이름에 꼭 종속일 필요는 없다. 게시글대로 resource고 게시판대로 리소스임로 나중에 이 두개를 붙이면 된다. (뭔소리인지..)
-
entity framework에서 select시에 tracking을 안하게 해야한다.(기본으로 왜 지원을 안하지?)
정리 필요
- 모든 api는 ( 컨트롤러는) return값에 http상태 코드를 보내고 conent에 data를 실어 보내야한다.
- Put은 StatusCode(HttpStatusCode.NoContent)를 결과로 던지자.
- Post는 꼭 새로 생성된 아이디를 받아야한다…
- 모든 컨트롤러는 테스트가 작성이 되어야한다.
- 모든 컨트롤러는 entity model을 직접 사용하지 말고 view model 을 만들어서 사용하자. - 심지어는 같은 클래스일 경우에도 복사를 하더라도 이 패턴을 지키자.
- 컨트롤러에서 절대 username을 받지 말자
- 프론트앤드에서는 절때 username 넘기지 말기
- api단이 노출하는 것과 프론트앤드에서 넘기는것이 일치하게 (과하게 노출하는것 금지)
- 비지니스 로직은 서비스 레이어에서
- 각 클래스는 각각의 파일에 있어야한다.
- 디비 쿼리 로직에 대한 모든 내용은 리파지토리에 작성되야한다.
- 리파지토리는 디비와의 연관만 담당한다.
- 리파지토리는 절때 IQueryable을 리턴해서는 안된다. IEnumerable을 리턴한다.
- 언제든 리파지토리만 바꿈으로써 orm이나 디비를 바꿀수 있다고 생각해야한다.
- 리파지토리에는 save/ update 가 없다…
- Update는 memory에서 수정하고 complete); 호출
- Add는 memory에 추가후 complete(); 호출
- 서비스 혹은 매니져 레이어는 기존에는 있엇으나 리팩토링하면서 같이 하면 너무 복잡하여 일단은 없는걸로 간주 컨트롤러에 로직을 넣기고 하겠음. 리팩토링이 완료되면 서비스 레이어를 나눌것임.
- 컨트롤러는 무조건 간단해야하며 로직이 들어가서는 안됨(위에꺼가 우선이므로 일단 보류)
- 컨트롤러는 어떤 로직도 포함하면 안된다
- repository도 어떤 비지니스 로직을 포함하지 말자.(디비관련된 내용만 넣어야함.)
- 테이블당 하나의 리파지토리 클래스
- 매직넘버를 사용하지 않기
- 중복을 사용하지 않기
- UnitOfWork 패턴과 리파지토리 패턴은 알아두자.
- 오토매퍼는 데이터의 매핑만 한데 어떤 로직도 들어가면 안됨.
- 오토매퍼는 컨트롤러에서만 사용하자 (서비스레이어에서도 사용이가능 그런데 리파지토리에서는 사용하지 말자.)
- 도메인에서는 뷰모델을 사용하지 말자. 모든 viewmodel은 api프로젝트에 있어야한다.(고민)
- 페이징 관련 용어 통일
- page : 몇번 페이지는 몇장인가
- pagenumber: 몇페이지인가 ⇒ 전체가 몇페이지인지 보여줄필요가 잇을까?
- size : 한페이지에 몇개씩 뿌리는가
- 테스트에서는 _unitofwork 사용가능한곳
- 컨트롤러 생성자에 넘겨줄때
- 실제디비에서 값을 가져와서 비교하는 부분( fromDB) 에만 사용하자.
- 하나의 함수는 하나의 기능을 해야한다.
- Api가 리턴값을 보낼때는 json으로 해야한다. 몇개만 list로 보내버리면 안됨..무조건 json으로 감싸아서 보내야함..