본문 바로가기
Spring boot 프로젝트 기록/1. 백엔드 개발

서비스 레이어 : 비즈니스 로직

by 으노으뇨 2021. 11. 24.
728x90
반응형
SMALL

서비스 레이어는 컨트롤러와 퍼시스턴스 사이에서 비즈니스 로직을 수행하는 역할을 한다. 

서비스 레이어는 HTTP와 긴밀히 연관된 컨트롤러에서 분리되어 있고, 

또느 데이터 베이스와 긴밀히 연관된 퍼시스턴스와도 분리되어 있다. 

따라서 서비스 레이어에서는 우리가 개발하고자 하는 로직에 집중할 수 있다.

TOdo 프로젝트를 위한 비즈니스 로직 구현을 위해 service페키지를 생성하고 그 아래에 TodoService를 만들어보자

package com.unoSpringBoot.study.service;

import org.springframework.stereotype.Service;

@Service
public class TodoService {
	public String testService() {
		return "TEST SERVICE";
	}
}

저번 글 실습을 위해 만들었던 Controller 클래스이다.

package com.unoSpringBoot.study.Controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.unoSpringBoot.study.DTO.ResponseDTO;

@RestController
@RequestMapping("todo")
public class TodoController {
	@GetMapping("/badConnect")
	public ResponseEntity<?> testControllerResponseEntity() {
		List<String> list = new ArrayList<String>();
		list.add("하위~~~~  내이름은 오류 400이야!! 반가워!!");
		ResponseDTO<String> response = ResponseDTO.<String>builder().data(list).build();
		return ResponseEntity.badRequest().body(response);
	}
	
}

를 만들었다, 여기에

	@Autowired
	private TodoService service; 
    
	@GetMapping("/test")
	public ResponseEntity<ResponseDTO<String>> testTodo() {
		String str = service.testService();
		List<String> list = new ArrayList<String>();
		list.add(str);
		ResponseDTO<String> response = ResponseDTO.<String>builder().data(list).build();
		return ResponseEntity.ok().body(response);
	}

를 추가해주었다.

그리고 테스트를 해보자.

이상없이 잘나온다.


이제 서비스단의 역할을 엔티티를 꾸며주자

기존에 생성한 TodoEntity에 추가를 해주자

package com.unoSpringBoot.study.model;

import javax.persistence.Entity;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
//@Entity에 이름을 부여할수있다. @Entity("TodoEntity)
@Table(name = "Todo")
public class TodoEntity {
	private String id; // 오브젝트의 아이디
	private String userId; // 이 오브젝를 생성한 아이디
	private String title; // Todo타이틀
	private boolean done; // true - todo 를 완료 , 미완료했을때

}

이렇게 간단하게 어노테이션을 추가해주었다.

@테이블 어노테이션은 데이터베이스의 Todo 테이블에 매핑된다는 뜻이다.

만약 @테이블을 추가하지 않거나 추가해도 name을 명시하지 않는다면 @엔티티의 이름을 테이블 이름으로 간주한다.

또 @엔티티에 이름을 지정하지 않는 경우 클래스의 이름을 테이블 이름으로 간주하니 명심하자!!

package com.unoSpringBoot.study.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
//@Entity에 이름을 부여할수있다. @Entity("TodoEntity)
@Table(name = "Todo")
public class TodoEntity {
	@Id // <-- 기본키가 될 필드에 지정한다!!
	private String id; // 오브젝트의 아이디
	private String userId; // 이 오브젝를 생성한 아이디
	private String title; // Todo타이틀
	private boolean done; // true - todo 를 완료 , 미완료했을때

}

@아이디는 기본키가 될 필드에 지정한다. 우리의 경우 아이디가 기본키 이므로 아이디 필드 위에 @아이디를 추가해야

한다. 아이디 필드는 오브젝트 데이터베이스에 저장할때마다 생성할 수도 있지만 @제너테이티드밸류 어노테이션을 이용해 자동으로 생성 할 수 도있다.

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
//@Entity에 이름을 부여할수있다. @Entity("TodoEntity)
@Table(name = "Todo")
public class TodoEntity {
	@Id
	@GeneratedValue(generator = "system-uuid") //<--
	@GenericGenerator(name = "system-uuid", strategy = "uuid") //<--
	private String id; // 오브젝트의 아이디
	private String userId; // 이 오브젝를 생성한 아이디
	private String title; // Todo타이틀
	private boolean done; // true - todo 를 완료 , 미완료했을때
}

@제너레이트밸루와 @지네릭제너레이터ㄹ 두 어노테이션을 사용헀다.

@제너레이티드밸류는 앞서 말했듯이 아이디를 자동으로 생성하겠다는 뜻이다.

이때 매개변수인 제너레이터로 어떤 방식으로 아이디를 생성할지 지정할 수 있다.

우리는 시스템-유유아이디 라는 제너레이터를 사용할 것이다. 

시스템 유유아이디는 @지네릭제너테이터에 정의된 제너레이터의 이름으로 @지네릭제너테리터는 Hibernate가 

제공하는 기본 제너레이터가 아니라 나만으 ㅣ제너레이터를 사용하고 싶을 경우 이용한다.

기본 제너레이터로는 INCREMENTAL, SEQUENCE, IDENTITY 등이 있는데, 우리는 문자열 형태의 UUID의 사용을 위해 

커스텀 제너레이터로 만들었다.


컨트롤러와 서비스에서 했던 것과 마찬가지로 퍼시스턴스를 관리하는 패키지를 만들고

그아래에 TodoRepository 인터페이스를 생성한 하고 코드를 넣어보자

package com.unoSpringBoot.study.persistence;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.unoSpringBoot.study.model.TodoEntity;

@Repository
public interface TodoRepository extends JpaRepository<TodoEntity, String> {

}

이제 임의로 한번 서비스단에서 사용해보자


TodoService .java에 코드를 추가해주자

package com.unoSpringBoot.study.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.unoSpringBoot.study.model.TodoEntity;
import com.unoSpringBoot.study.persistence.TodoRepository;

@Service
public class TodoService {

	@Autowired
	private TodoRepository todoRepository;

	public String testService() {
		TodoEntity todoEntity = TodoEntity.builder().title("하위~").userId("KimEunHo").build();
		todoRepository.save(todoEntity);
		TodoEntity saveEntity = todoRepository.findById(todoEntity.getId()).get();
		return saveEntity.getUserId()+" <-- 아이디 , 제목 --> " + saveEntity.getTitle();
	}

}

테스트하면 해당 값이 정상적으로 온것을 확인 할 수 있따.

 

728x90
반응형
LIST

댓글