정글에서 온 개발자

Spring 게시판 Skeleton 코드 본문

정리

Spring 게시판 Skeleton 코드

dev-diver 2024. 1. 5. 11:26

디렉토리 구성

  • model
    • ArticleEntity.java
  • dto
    • ArticleDTO.java
    • ReponseDTO.java
  • repository
    • ArticleRepository.java (interface)
  • service
    • ArticleService.java
  • controller
    • ArticleController.java

코드

Entity(Model)

  • 테이블 스키마 그 자체
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name = "Article")
public class ArticleEntity {
    @Id
    @GeneratedValue(generator="system-uuid")
    @GenericGenerator(name="system-uuid", strategy="uuid")
    private String id;
    private String userId;
    private String title;
    private String text;
}

DTO

ArticleDTO

  • Controller가 받는 RequestBody
  • Response의 data 부분에 싣는 형(type)이기도 함.
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ArticleDTO {
    private String id;
    private String title;
    private String text;

    public ArticleDTO(final ArticleEntity entity){
        this.id = entity.getId();
        this.title = entity.getTitle();
        this.text = entity.getText();
    }

    public static ArticleEntity toEntity(final ArticleDTO dto){
        return ArticleEntity.builder()
                .id(dto.getId())
                .title(dto.getTitle())
                .text(dto.getText())
                .build();
    }

}

ResponseDTO

  • controller가 반환하기 위한 최종 DTO
  • 다른 DTO들이 List형태로 쌓여서 반환된다.
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDTO<T> {
    private String error;
    private List<T> data;
}

Repository

  • 웬만한 건 JPA가 알아서 다 해줌
@Repository //레포지토리
public interface ArticleRepository extends JpaRepository<ArticleEntity,String> {
}

Service

//@Slf4j
@Service  //서비스인걸 알림
public class ArticleService {

    @Autowired
    private ArticleRepository repository; //나중에 생성자로 바꿔야 함(김영한)

		//entity를 받아서 repository로 읽고, 
		//반환한 결과를 List로 반환 -> ResponseDTO의 list로 넘겨주기 위해
    public List<ArticleEntity> create(final ArticleEntity entity){
        //validate(entity);
        repository.save(entity);
        //log.info("Entity ID : {} is saved", entity.getId());
        return Collections.singletonList(repository.findById(entity.getId()).get());
    }

}

Controller

@RestController //REST 용 컨트롤러
@RequestMapping("api/board")
public class ArticleController {

    @Autowired //생성자로 바꿔야 함
    private ArticleService service;

    @PostMapping
		//requests body를 받아서 responseEntity(REST에 정의)를 반환
    public ResponseEntity<?> createArticle(@RequestBody ArticleDTO dto){
        try{
						
						//임시 나중에 id까지 받음
            String temporaryUserId = "temporary-user";

            //repository에 저장 준비
						ArticleEntity entity = ArticleDTO.toEntity(dto);
            entity.setId(null);
            entity.setUserId(temporaryUserId);
						//저장 후 최종 결과 반환
            List<ArticleEntity> entities = service.create(entity);

            //반환값을 response 의 data에 삽입하기 위해 articleDTO 만듬
						List<ArticleDTO> dtos = entities
									.stream().map(ArticleDTO::new)
									.collect(Collectors.toList());

            ResponseDTO<ArticleDTO> response = ResponseDTO
										.<ArticleDTO>builder()
										.data(dtos).build(); //data(list)에 dto 삽입
            return ResponseEntity.ok().body(response);
        }catch(Exception e){
            String error = e.getMessage();
            ResponseDTO<ArticleDTO> response = ResponseDTO.<ArticleDTO>builder().error(error).build();
            return ResponseEntity.badRequest().body(response);
        }
    }
}
  • GET skeleton
    @GetMapping
    public String ArticleController(){
        return "Hello World!";
    }

    @GetMapping("/{id}")
    public String articleControllerWithId(@PathVariable(required= false) Long id){
        return "Hello World!" + id;
    }

 

깃허브

https://github.com/dev-diver/spring-page.git

참고자료

 

React.js, 스프링 부트, AWS로 배우는 웹 개발 101 - 예스24

다수의 사용자를 지원하는 Todo 웹 애플리케이션을 구현하고 배포한다. 또한 현장에서 많이 사용하는 프론트엔드와 백엔드 서버가 분리된 아키텍처(Decoupled Architecture)구현한다. 또한 배포 시 단

m.yes24.com