쌩로그

Controller 구현 ( for. 객체지향적인 코드) 본문

Project/Solo - Blog프로젝트(그냥 Toy 레알 장난감)

Controller 구현 ( for. 객체지향적인 코드)

.쌩수. 2023. 5. 10. 18:22
반응형

나는 어차피 잘 될 사람이다.

어차피 잘 될 것이고, 지금도 잘 되고있고, 과거도 잘 되어왔기에,,,


목차

  1. 문제
  2. 고민
  3. 해결
  4. 요약

1. 문제

내가 생각하는 것은
Controller를 인터페이스로 두고, 기능들을 추상메서드로 정의 해놓은 후,
각각 구현체에 맞게 커스터마이징 하기를 원했다.

그런데, 생각해보니 얘네들이 반환타입이 다르다...?

어쨌든 추상메서드를 구현하려면 선언부가 같아야되는데,

SSR 방식의 Controller는 View이름인 String 타입을 반환할 것이고,
CSR 방식의 Controller는 ResponseEntity 타입을 반환할 것인데..

이걸 어떻게 해야되지..?

여기가 문제였다.

2. 고민

그래서 고민했다.

"흠... Controller를 아예 따로 만드는 게 더 나은건가....? 그리고 인터페이스 코드가 괜히 더 많아지는 건가..?" 라고 생각했고,

그리고 인터페이스로 추상메서드로 해놓으면, 어차피 다 구현해야되는데.... 어떻게 하지...?
하다가 떠오른 것이 바로 default 메서드다.

default 메서드로 일단 만들어놓으면 필요한 것만 Override하면 되니깐 그렇게 하면 되겠네 하고 생각했다.

그리고 한번 해봤다...

import org.springframework.http.HttpStatus;  
import org.springframework.http.ResponseEntity;  


/**  
 * SSR 방식의 Controller와 CSR방식의 Controller를 위한 Controller 인터페이스.  
 */public interface ControllerCore {  

    default String postView() {  
        return "post";  
    }  

    default String patchView() {  
        return "patch";  
    }  

    default String getView() {  
        return "get";  
    }  

    default String getAllView() {  
        return "getAll";  
    }  

    default String deleteView() {  
        return "delete";  
    }  

    //  

    default ResponseEntity post() {  
        return new ResponseEntity(HttpStatus.CREATED);  
    }  

    default ResponseEntity patch() {  
        return new ResponseEntity(HttpStatus.OK);  
    }  

    default ResponseEntity get() {  
        return new ResponseEntity(HttpStatus.OK);  
    }  

    default ResponseEntity getAll() {  
        return new ResponseEntity(HttpStatus.OK);  
    }  

    default ResponseEntity delete() {  
        return new ResponseEntity(HttpStatus.NO_CONTENT);  
    }  


}

흠....그래도 뭔가 똑같은 기능을 하는 메서드가 두개씩 있다..;;;

"일단은 일단락 했으니 한 번 해보자"하고 있는데, 그래도 뭔가 찜찜했다..
;;;;

흠...그러다 문득 스친 생각은.. 이 때 컴퓨터에서 잠깐 물 마시러 간걸로 앎..
`"혹시.. Object로 가능할까..?"``

Object post1();

이 코드를 추가하고,

ViewController로 가서 확인해보았다.

@Controller  
public class ViewController implements ControllerCore{  

    @Override  
    public String post1() {  
        return "";  
    }  
}

오...??
오???!!!
오!!!!!!!!!!!!

이거였다....

3. 해결

이렇게 인터페이스에는 Object를 반환타입으로 두고, 반환타입을 다르게 주면 컴파일 통과는 된다.
그리고 CSR 방식의 Controller 또한 한번 해보았다.

/**  
 * CSR 방식의 Controller  
 */@Controller  
public class CsrController implements ControllerCore {  

    @Override  
    @GetMapping("/post")  
    public ResponseEntity post() {  
        return new ResponseEntity("Post", HttpStatus.CREATED);  
    }  

    @Override  
    @GetMapping("/patch")  
    public ResponseEntity patch() {  
        return new ResponseEntity("Patch", HttpStatus.OK);  
    }  

    @Override  
    @GetMapping("/get")  
    public ResponseEntity get() {  
        return new ResponseEntity("Get", HttpStatus.OK);  
    }  

    @Override  
    @GetMapping("/getAll")  
    public ResponseEntity getAll() {  
        return new ResponseEntity("GetAll", HttpStatus.OK);  
    }  

    @Override  
    @GetMapping("/delete")  
    public ResponseEntity delete() {  
        return new ResponseEntity("delete", HttpStatus.NO_CONTENT);  
    }  
}

그리고 서버를 실행 시키고 한번 확인해보았다.

REST API는 일단임시로 한 것이다. ~

아래는 CSR 방식의 결과이다.






deleteNO_CONTENT로 설정했기 때문에, 네트워크 탭을 통해서 확인했다.

다음은 SSR 쪽으로 가서 확인해보자

음... 얘는 안되겠다..
당연하게도 view가 없다...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
하..;;;
임시로라도 한번 만들어보고 확인해봤다...





잘 나온다..

여담으로. 순간 파일 이상한데 놔두고, 에러 뜨길레 벙쪘음..;;;
template에 넣어야 했었는데, static 안에 놔두고 왜 안되지 잠깐 고민했음...

> template 안에 넣어두니 잘 나옴.

여튼..

4. 요약.

  1. Controller의 반환타입이 각 Controller마다 다르고, default 메서드로 선언해도 중복코드가 발생한게 발단이었다.
  2. 모든 클래스의 조상인 Object를 추상메서드의 반환타입으로 둠으로써, 구현했을 때, 어떤 타입으로든 반환할 수 있도록 했다.
  3. 그리고 잘 작동하기까지 확인했다.
  4. thymeleaf의 html은 template 안에 넣어야 한다.

-끝-

728x90
Comments