Spring

Spring Main Page Project

code2772 2022. 12. 18. 20:24
728x90
반응형

✔ 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이라면
    }
}
반응형