plugins {
id 'org.springframework.boot' version '2.4.2'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
//- restAPI 구현을 위한 dependency
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//- jpa 구현을 위한 dependency
runtimeOnly 'com.h2database:h2'
annotationProcessor('org.projectlombok:lombok:1.18.22')
compileOnly('org.projectlombok:lombok:1.18.22')
}
추가된 라이브러리들의 코드들을 한번씩 보는것이 좋다고 하셨다. 왜냐면 Spring이라는 프레임워크는 엄청 좋은 코드들이 많고, 이런 코드들을 보는것 자체가 좋은 코드를 짜는 법을 배울수 있다고 하셨다. 아직 어떤 식으로 짜야하는지 잡혀있지않기때문에 틈틈히 봐야겠다.
지금 하는 강의에서는 모델, repository, 서비스 코드, 컨트롤러 layer로 나눠서 개발을 진행하신다고 하셨다. 그 이유로는 각각의 레이어에서 각각의 기능만 구현하면되서 수정하고 싶을때 손쉽게 수정할 수있고 컴포넌트별로 구분해서 작성하면 다른 레이어의 주는 영향이 줄어들게 되고 유지보수가 쉬워진다고 하셨다.
현장실습을 통해서도 배웠는데 내가 짠 코드들은 어디에 어떤 기능들이 동작하고 너무 연관이 깊게 짠것같아서 어떤 식으로 코드를 나누고 짜야하는지 고민을 했던적이 있다. 이제부터 이렇게 기능별로 나누어 짜면서 습관을 가져야겠다.
모델 패키지에 TodoEntity,TodoRequest,TodoResponse
@Data
@Entity
@NoArgsConstructor //- 어노테이션은 파라미터가 없는 기본생성자 생성
@AllArgsConstructor //- 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어줌
public class TodoEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //-자동생성하고 Identity : 데이터베이스에 위임
private Long id;
@Column(nullable = false)
private String title;
@Column(name = "todoOrder",nullable = false)
private Long order;
@Column(nullable = false)
private Boolean completed;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodoRequest {
private String title;
private Long order;
private Boolean completed;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodoResponse {
private Long id;
private String title;
private Long order;
private Boolean completed;
private String url;
public TodoResponse(TodoEntity todoEntity){
this.id= todoEntity.getId();
this.title= todoEntity.getTitle();
this.order= todoEntity.getOrder();
this.completed=todoEntity.getCompleted();
this.url="https://localhost:8080/"+this.id;
}
}
repository는 실제 데이터를 저장하는 클래스가 아니라 데이터를 주고받는 인터페이스라는 점을 알고있어야한다.
JpaRepository를 상속받아서 인터페이스로 생성을 한다.
@Repository
public interface TodoRepository extends JpaRepository<TodoEntity,Long> {
}
작성한 repository가 실제로 동작하는 코드를 작성할 예정
@Service
@AllArgsConstructor
public class TodoService {
private final TodoRepository todoRepository;
public TodoEntity add(TodoRequest request){
TodoEntity todoEntity=new TodoEntity();
todoEntity.setTitle(request.getTitle());
todoEntity.setOrder(request.getOrder());
todoEntity.setCompleted(request.getCompleted());
return this.todoRepository.save(todoEntity);
}
public TodoEntity searchById(Long id){
return this.todoRepository.findById(id)
.orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND));
}
public List<TodoEntity> searchAll(){
return this.todoRepository.findAll();
}
public TodoEntity updateById(Long id,TodoRequest request){
TodoEntity todoEntity = this.searchById(id);
if(request.getTitle()!=null){
todoEntity.setTitle(request.getTitle());
}
if(request.getOrder()!=null){
todoEntity.setOrder(request.getOrder());
}
if(request.getCompleted()!=null){
todoEntity.setCompleted(request.getCompleted());
}
return this.todoRepository.save(todoEntity);
}
public void deleteById(Long id){
this.todoRepository.deleteById(id);
}
public void deleteAll(){
this.todoRepository.deleteAll();
}
}