본문 바로가기
Spring

Spring Main Page Project

by code2772 2022. 12. 18.

[ 목차 ]

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