정글에서 온 개발자
Spring 게시판 Skeleton 코드 본문
디렉토리 구성
- 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
참고자료
'정리' 카테고리의 다른 글
[연차 촉진 시스템] 기획과 문제 해결을 위한 DB설계 (0) | 2024.06.17 |
---|---|
Spring 데이터 관리 라이브러리 변화와 비교 (1) | 2024.01.05 |
Spring 큰 그림 그려보기 (1) | 2024.01.05 |
VSC에서 C 코딩 빨간줄 없애기 (feat. pintos project3) (0) | 2023.12.28 |
[pintOS]-Priority Inversion, Multiple, Nested 정리 (1) | 2023.12.05 |