스프링부트 개발 가이드

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)
  1. 클래스 생성 및 수정 시 주석 달기 code snippet
  2. 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