라이브러리를 쓰면 생기는 단점 - 그래서 리플렉션이…!
우리가 앞에서 짠 코드를 유지보수 한다고 생각해 보자 BankController에 withdraw() 메소드를 새로 만들 것이다!
근데... 디스패처(라우터)에 withdraw() 메소드가 없잖아ㅠㅠ 실행이 되겠니? 절대.안됨
withraw() 있나 보세요. 없지요? 그럼 라이브러리 만든 사람에게 전화해서 witrhraw() 좀 만들어주세요 ㅠㅠ 해야함 그래서 그분이 else if (url.equals(”withraw”) { con.withraw(); 이렇게 새로 메소드를 만들어줬어... 근데 이번엔 deposit()을 만들어야 해. 그럼 또 deposit()을 만들어달라고 전화하고…… > 라이브러리 단점
[ 그런데 왜 라우터를 라이브러리로 사용할까? ]
개발자가 수동으로 모든 URL 주소를 라우터에 일일이 작성하는 번거로움을 줄이기 위해서다. (URL 주소 분기를 일일이 router에다가 다 적을셈이냐 50000개를??)
주소 분기?
사용자가 입력한 주소를 보고 그에 맞는 페이지나 기능으로 연결해주는 역할
주소가 "/users"인 경우, 주소 분기는 "/users"에 대응하는 컨트롤러를 찾아서 해당 코드를 실행한다
ex. 사용자가 웹 브라우저에서 "https://www.example.com/products"라는 주소를 입력했다고 가정. 이때 주소 분기는 "/products"라는 주소를 보고, 이에 해당하는 상품 목록 페이지로 사용자를 연결해 준다.
[ 그래서 나왔다! 리플렉션! ]
리플렉션은 내가 무슨 메소드를 만들든 다 때려준다. 앞에서 설명한대로 라이브러리를 만들어준 사람이 내가 어떤 메소드의 이름을 쓸지 모르는데, 유지보수도 안해주고 다 동작하게 만들어준다! 그게 바로 리플렉션!
리플렉션은 내가 컨트롤러에서 무슨 메소드를 만들든, 디스패처에 직접 추가할 필요 없이 자동으로 else if (url.equals("withdraw") { con.withdraw(); } 를 만들어 주는 것... 정도로 생각하면 될 듯
프로그램의 실행 중에 클래스의 정보를 분석하고 조작할 수 있기 때문에, 사용자가 만든 메소드의 이름이 무엇인지 미리 알지 못해도 동적으로 해당 메소드를 찾아서 실행할 수 있다. 이를 통해 사용자는 라우터에 메소드를 등록하거나 수정할 필요 없이 원하는 기능을 추가하고 실행할 수 있다.
리플렉션과 어노테이션
[ 리플렉션 ]
프로그램 실행 중에 클래스의 정보를 분석하고, 클래스의 멤버(필드, 메소드, 생성자 등)에 접근하고 조작하는 기능을 제공
기본 코드와 리플렉션 중 기존코드가 속도가 훨씬 빠르다 리플렉션은 동적으로 모두 다 확인하고 가기 때문에 분석하는 시간이 오래 걸린다. 때문에 리플렉션을 적절하게 쓰는게 좋다 그림 상으로... 모든 나무를 다 분석해가면서 올라가는게 바로 리플렉션
[ 리플렉션은 언제 쓰나? ]
1. 동적일 때 사용자가 입력한 데이터에 따라 다른 로직이 실행되어야 할 때는 미리 해당 입력 값을 알 수 없으므로 동적으로 처리해아 한다. (즉, 미리 코딩을 못한다는 뜻) 2. 1차 개발자 / 2차 개발자 나뉘는 경우 메소드를 돌릴 때마다 라이브러리 만드는 사람한테 유지보수 해달라 말해야할 때
[ 리플렉션 ♥ 어노테이션 ]
어노테이션을 붙이면 리플렉션을 효율적으로 사용할 수 있다. (어노테이션은 깃발이다. 즉, 나무에 깃발을 꽂아놓고, 이것만 봐!! 라고 하는 것. 덕분에 깃발이 있는 것만 보고 관리할 수 있으니까, 전부 다 안들러도 됨! = 속도 빨라짐?) 어노테이션을 안쓰면 전부.. 전부 검사...
TIP!
리플렉션을 우리가 만들 일은..없다. 우린 깃발을 꽂을 줄만 알면 된다!!
Share article