✔ UserApiRequest : 클라이언트가 서버쪽으로 요청할 정보를 전달해주는 부분
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class UserApiRequest {
//클라이언트가 서버쪽으로 요청할 정보를 전달해주는 부분
private String userid;
private String name;
private String userpw;
private String hp;
private String email;
}
✔ UserApiResponse : 서버가 사용자에게 줄 수 있는 데이터들을 클래스화
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserApiResponse {
//서버가 사용자에게 줄 수 있는 데이터 들을 클레스 화
private Long id;
private String userid;
private String name;
private String userpw;
private String hp;
private String email;
private LocalDateTime regDate;
private UserStatus status;
}
✔ Header
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Header<T> {
private LocalDateTime transactionTime;
private String resultCode;
private T data;//리스폰스,리퀘스트 값 전달?
private String description;
/* T data
json
{
transactionTime : 현재시간,
resultCode : 200,
data : {
userid : "apple",
....
}
description : "정상"
*/
public static <T> Header<T> Ok(){ // 다른 곳에서 ok라는 메소드를 사용(호출)하면
//헤더 객체를 만들고 밑에 있는 내용들을 넣어주는 것을 만들고 리턴하라는 내용이다.
// 클라이언트가 페이지 보여줘 라고 하면 정보 담을게 없으면 응답만 하기에 사용되는 내용이다
return (Header<T>)Header.builder().transactionTime(LocalDateTime.now())
.resultCode("ok").description("정상").build();
}
private static <T> Header<T> OK(T data){
return (Header<T>)Header.builder().transactionTime(LocalDateTime.now())
.resultCode("ok").description("정상").data(data).build();
}
public static <T> Header<T> ERROR(String description){
return (Header<T>)Header.builder().transactionTime(LocalDateTime.now())
.resultCode("ERROR").description("에러!").build();
}
}
public static <T> Header <T> OK() { .....}
: 다른 곳에서 ok 메소드를 사용 또는 호출하면 Header 객체를 만들고 괄호안에 있는 내용을 실행하여 리턴값을 전달한다. 예를들어 클라이언트가 페이지 보여줘 라고 하면 정보 담을게 없으면 응답만 하기에 사용되는 내용이다.
✔ CrudInterface
public interface CrudInterface<Req, Res> {
Header<Res> create(Header<Req> request);
// create(Header<Req>요청하면 반환은Header<Res>
Header<Res> read(Long id);
Header<Res> update(Header<Req> request);
Header<Res> delete(Long id);
}
Header<Res> create(Header<Req> request);
: 사용자가 create(Header<Req> request) 요청하면 반환(응답은) Header<Res>를 한다.
Header<Res> read(Long id);
:
@Component // Bean으로 사용하기 위해, 나중에 Controller을 상속하여 사용하기 위해
// 다른 기능들로 추가하기 위해 데이터를 주입받아 Header를 사용?
// 기본적으로 타입기반의 자동주입 어노테이션(Autowired 비슷한 기능)
public abstract class CrudController<Req, Res, Entity> implements CrudInterface<Req, Res> {
@Override
public Header<Res> create(Header<Req> request) {
return null;
}
@Override
public Header<Res> read(Long id) {
return null;
}
@Override
public Header<Res> update(Header<Req> request) {
return null;
}
@Override
public Header<Res> delete(Long id) {
return null;
}
}
// CTRL + SHIFT + R : 원하는 부분 전체 변경 하기
@Override
@PostMapping("") // http://localhost:8888/api/user (post)
public Header<UserApiResponse> create(@RequestBody Header<UserApiRequest> request) {
return userApiLogicService.create(request);
}
@Override
@GetMapping("{id}") // http://localhost:8888/api/user/{id} (Get)
public Header<UserApiResponse> read(@PathVariable(name="id") Long id) {
// @pathvariable 유얼엘 아이디 번호를 받아 return넘겨주는 것
return userApiLogicService.read(id);
}
@Override // http://localhost:8888/api/user (put)
@PutMapping("")// post 방식으로 사용간에는 postman을 이용하여 사용한다.
public Header<UserApiResponse> update(@RequestBody Header<UserApiRequest> request) {
return userApiLogicService.update(request);
}
@Override // http://localhost:8888/api/user/{id} (delete)
@DeleteMapping("{id}")
public Header<UserApiResponse> delete(@PathVariable Long id) {
return userApiLogicService.delete(id);
}
}
@RequestBody : Request(요청) + Body(본문 내용), 본문에 담기는 데이터 형식 -> JSON(형식에서 많이 사용한다.)
public Header<UserApiResponse> create(@RequestBody Header<UserApiRequest> request)
@GetMapping : Get방식으로 API 요청
@PathVariable : @GetMapping 방식에서 자주 보이는 방식이며, {템블릿 변수}와 동일한 이름을 갖는 파라미터를 추가한다.
public Header<UserApiResponse> create(@PathVariableue (name = "id") Long id)
✔ 불러오기
@Service
@RequiredArgsConstructor
public class UserApiLogicService extends BaseService<UserApiRequest, UserApiResponse, Users> {
private UserApiResponse response(Users users){
UserApiResponse userApiResponse = UserApiResponse.builder()
.id(users.getId())
.userid(users.getUserid())
.userpw(users.getUserpw())
.name(users.getName())
.hp(users.getHp())
.email(users.getEmail())
.regDate(users.getRegDate())
.status(users.getStatus())
.build();
return userApiResponse;
}
public class UserApiLKogicalService extends BaseService<UserApiRequest, UserApiResource, Users>
: BaseService를 상속받는다 여기서 BaseService는 <Req, Res, Entity> 형식으로 되어있기 때문에 위와 같은 형식으로 선언한다.
✔ Create
@Override
public Header<UserApiResponse> create(Header<UserApiRequest> request) {
UserApiRequest userApiRequest = request.getData();
Users users = Users.builder().userid(userApiRequest.getUserid())
.userpw(userApiRequest.getUserpw())
.name(userApiRequest.getName())
.hp(userApiRequest.getHp())
.email(userApiRequest.getEmail())
.status(UserStatus.REGISTERED)
.build();
Users newUsers = baseRepository.save(users);
return Header.OK(response(newUsers));
}
1. public Header<UserApiResponse> create(Header<UserApiRequest> request)
Header에서 <UserApiRequest> request를 요청하면 <UserApiResponse>를 응답해준다.
2. UserApiRequest 객체를 선언해주고 변수를 넣어준다.
3. baseRepository 에 저장하고 해당 API를 확인하면 가능하다.
✔ READ
@Override
public Header<UserApiResponse> read(Long id) {
return baseRepository.findById(id).map(users -> response(users)).map(Header::Ok) //null이 아니라면
.orElseGet(()->Header.ERROR("데이터 없음")); //null이라면
}
✔ update
@Override
public Header<UserApiResponse> update(Header<UserApiRequest> request) {
UserApiRequest userApiRequest = request.getData();
Optional<Users> users = usersRepository.findByUserid(userApiRequest.getUserid());
return users.map(
user -> {
user.setUserpw(userApiRequest.getUserpw());
user.setName(userApiRequest.getName());
user.setHp(userApiRequest.getHp());
user.setEmail(userApiRequest.getEmail());
return user;
}).map(user -> usersRepository.save(user))
.map(user -> response(user))
.map(Header::Ok)
.orElseGet(()->Header.ERROR("데이터 없음")
);
}
✔ delete
@Override
public Header delete(Long id) {
Optional<Users> users = baseRepository.findById(id);
return users.map(
user -> {
baseRepository.delete(user);
return Header.Ok();
}).orElseGet(()->Header.ERROR("데이터 없음")); //null이라면
}
}
'Spring' 카테고리의 다른 글
Spring 유용한 Setting, 사이트 (0) | 2022.12.29 |
---|---|
Spring 타임리프 이용 기본 (0) | 2022.12.19 |
Spring Join (0) | 2022.12.13 |
Spring (리스너, 연관 관계 메핑, 어노테이션) (0) | 2022.12.13 |
Spring (Enum, Query Method 기본, Optional, @Bean) (0) | 2022.12.11 |