스프링부트 개발 가이드
2023. 11. 8. 15:04ㆍ스프링
- rest방식의 uri의 경우 “/api”를 붙여 준다.
- 유저라는 엔티티의 crud의 uri의 경우 복수형으로 적어준다 ex) userList(x)
GET /users
POST | /users |
PUT | /users/{id} |
DELETE | /users/{id} |
- 연관관계에 있는 uri의 경우 뒤에 행위를 적어준다 ex) has 소유관계 “/users/{id}/exists”
- 엔티티와 컨트롤러에는 swagger를 적용한다 ex) user 참고
- uri에는 가급적 camelcase를 사용 하지 않고 하이픈(-)을 사용한다. ex)sysCode(x) ⇒ sys-code(o)
- 패키지 이름은 무조건 소문자!
- 데이터를 전송하거나 받을 때 가급적 entity에 직접 접근하지 말고 DTO, VO를 생성해서 해준다.
- service는 인터페이스로 만들고 impl을 만들어 implements 받아 사용한다.
- 등록,수정,삭제 메시지 등 공통으로 사용될 수 있는 문자열은 messages_ko_KR.properties에 정의하고 사용한다.
- application-local.yml 파일은 commit 하지 않는다 commit 대상에서 아예 제외!
- 비즈니스 로직은 가급적 service단에서 코딩한다.
- 의존성 주입의 경우 필드 주입 보단 생성자 주입을 사용한다. 테스트 및 설정 파일 제외
// 필드 주입
public class BoardRestController {
@Autowired
private YongUserService yongUserService;
...
} (x)
// 생성자 주입
public class BoardRestController {
private YongUserService yongUserService;
public BoardRestController(YongUserService yongUserService) {
this.yongUserService = yongUserService;
}
....
} (o)
// lombok을 사용할 경우
// lombok을 이용한 생성자 주입
@RequiredArgsConstructor
public class BoardRestController {
private final YongUserService yongUserService;
....
} (o)
- 클래스 생성 및 수정 시 주석 달기 code snippet
- Entity, DTO, VO ..에서 기본 생성자를 public/protected를 통해 만들어준다.
→ @NoArgsConstructor(access = AccessLevel.PROTECTED) 어노테이션을 클래스에 붙임으로써, 클래스 안에서 따로 public/protected를 통해 기본 생성자를 만들 필요가 없다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Address {
private String city;
private String street;
private String zipcode;
// public, protected를 사용할 수는 있지만, 가능하면 protected로 사용하는 것이 좋다.
// -> 다음과 같이 기본 생성자를 만들어야 하지만, 위와 같이 어노테이션 추가를 통해 생략 가능하다.
// protected Address(){}
public Address(String city, String street, String zipcode){
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
}
- @PathVariable 사용
@GetMapping("/members/{id}")
public String findMember(@PathVariable("id") Long id) {
// public String findMember(@PathVariable("id") Member member) {
Member member = memberRepository.findById(id).get();
return member.getUsername();
}
- setter 사용을 지양
private String name;
private int price;
private int stockQuantity;
// Setter 대신 생성해준 메서드
public void addStock(int quantity) {
this.stockQuantity += quantity;
}
// Setter 대신 생성해준 메서드
public void removeStrock(int quantity) {
int restStock = this.stockQuantity - quantity;
if (restStock < 0) {
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = restStock;
}
- 컬렉션(list, set, map…)의 경우 필드에서 초기화 시키길 권장
@Getter
public class Member {
private Long id;
private String name;
private Address address;
private List<Order> orders; (x)
private List<Order> orders = new ArrayList<>(); (o) // 필드에서 초기화
}
'스프링' 카테고리의 다른 글
Telegram bot longPolling과 webhook (0) | 2024.02.27 |
---|---|
spring filterChain 동작과정 (1) | 2023.11.15 |
springboot redis 연동 (0) | 2023.10.11 |
네이버 클라우드 sens 알림톡 발송 (0) | 2023.09.26 |
yml 파일 암호화 (1) | 2023.08.29 |