Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Share] 3주차 토론 내용 #8

Open
sojeongw opened this issue Jan 23, 2020 · 5 comments
Open

[Share] 3주차 토론 내용 #8

sojeongw opened this issue Jan 23, 2020 · 5 comments
Labels
Share This issue is about sharing things related with study

Comments

@sojeongw
Copy link

sojeongw commented Jan 23, 2020

Topic

[토비의 스프링] 3장. 템플릿

Detail

템플릿

템플릿 메소드 패턴과 전략 패턴

소정

전략 패턴과 템플릿 메소드 패턴의 정확한 차이를 모르겠다.

성재

비슷한데 템플릿 메소드 패턴이 좀 더 유연한거라고 할 수 있다.

주형

나도 템플릿 메소드 패턴이 확장성이 더 높고 유연하다는 말이 구체적으로 뭘 의미하는지 궁금해서 찾아봤다.

템플릿 메소드 패턴은 구체적으로 어떤 클래스를 사용할지 알고 있고, 전략을 바꿔버리면 다 깨진다. 반면 전략 패턴은 인터페이스로 한단계 더 숨기게 된다. 그래서 수정해도 ide에 빨간 줄이 안 뜬다. 이런게 유연하고 확장성 있다는 말 아닐까. 내가 좀 고쳐도 덜 깨지는 거.

우리가 이런 패턴을 공부하는 이유는 기능을 고치고 빨리빨리 적용하기 위한 것이다. 유연하다는 게 그런 말이 아닐까. 어떤 요구사항을 추가했을 때 편-안- 하게 되는 것.

나라면 공통의 기능을 쓸 때 전략 패턴으로 쓸 거 같다. 같은 로직을 공유해서 쓰고 싶을 때 그걸 인터페이스로 빼는 거다. 그래서 템플릿 메소드 패턴은 무조건 전략 패턴으로 다 바꿀 수 있다고 생각한다.

민수

학부 때 템플릿 메소드 패턴은 고정되어 있는 내용을 재사용 할 수 있게 만들어 같이 쓰는 것, 전략 패턴은 다 같이 써야하는 게 있지만 그 안에 바뀌어야 하는 게 있어서 갈아 끼우는 것이라고 배웠다.

준희

템플릿 메소드 패턴은 공통적인 걸 묶는 데에 의미가 있는 것 같고 전략 패턴은 새로운 걸 추가하는 데에 있는 것 같다.

근원

템플릿 메소드 패턴은 상속을 하나밖에 못쓰니까 불편하다는 얘기도 있었던 것 같다.

소정

그럼 템플릿 메소드 패턴은 interface 를 안쓰나?

민수

템플릿 메소드 패턴은 뭔가를 딱 정해주려고 하는거니까 구체적인 클래스 즉, 추상 클래스 같은 걸 더 사용하는 것 같다.

익명 내부 클래스

내부 클래스의 효용성

주형

책 예제에서 쿼리가 조금만 더 길었다면 익명 내부 클래스를 이용해 하나로 합치는 게 아니라, 아예 다른 클래스로 빼는 게 나았을 것 같다. 그리고 이너 클래스는 캡슐화를 깰 수 있다는 단점이 있다. 예제에서도 user를 외부 메소드에서 끌어오기 때문에 캡슐화가 깨진다. 부모 클래스 변수를 가져다 쓰면 캡슐화가 깨질 수 있다고 한다.

민수

근데 예제는 메소드 레벨에서 사용한 거라 괜찮지 않나?

주형

나는 똑같은 얘기인 것 같다. 메소드만 보면 user가 어디서 나왔는지 모를 수 있기 때문이다.

근원

나는 문제가 없다고 생각한다. 응집성이 높아서 좋다. 가독성 측면에서는 주형의 생각에 공감이 가지만, 이 예제는 이너 클래스를 쓰면서 ''이건 하나다'' 라는 생각이 드는 잘된 캡슐화라고 생각한다.

주형

나도 저 상태까지는 괜찮은데 더 복잡해지면 구분해야하지 않을까 생각한다.

성재

주형이 말하는 것이(쿼리가 길어지는 코드) 바로 특별한 예외에 해당하지 않나 싶다.

근원

이 예제 코드는 어디서 따로 쓸것도 아니고 여기서만 쓰는 거다. 재사용하는게 아니니까 합치는 게 낫다고 말하는 것 같다.

프레임워크에 따른 내부 클래스의 사용 빈도

소정

안드로이드 코드에서는 이너 클래스 쓰는 걸 많이 봤는데 왜 스프링에서는 그렇지 않은가?

성재

스프링은 그냥 빈을 주입하면 되니까. 지금 책의 예제는 그냥 스프링 설명을 하기 위해 단계를 밟아가는 과정에서 쓴 것 같다.

JDBC 컨텍스트

서비스 오브젝트의 의미

주형

책을 보면 JDBC 컨텍스트는 상태가 없고 서비스 오브젝트로서 의미가 있기 때문에 싱글톤으로 관리한다고 했는데, 서비스 오브젝트가 정확히 무슨 의미인가?

근원

그냥 말 그대로 DB를 연결해주는 서비스를 해주는 거라 붙인게 아닐까.

소정

MVC 패턴에 나오는 그 서비스인줄 알았다.

성재

DDD의 서비스가 stateless를 의미하는 것이라 이걸 의미하는 것 같다.

주형

찾아보니까 도메인 specific한 것이라고 한다. 구체적인 DB의 인터페이스를 구현한 오브젝트. UserDao는 JDBC에 맞게 만들어진 객체다. 만약 jpa 같은 걸 쓰려면 완전히 바꿔야 하는 구조다. 그래서 서비스 오브젝트를 가져온 것 같다. 어떤 특성에 초점을 맞추려고 주입하는 걸로 보인다.

성재

결론적으로는 강한 응집도를 가지고 있어서 서비스 오브젝트를 이용한다고 이해하면 될 것 같다.

근원

나는 책의 문장 맥락을 보니까 서비스라는 의미가 공유에 더 초점을 맞춘 거 같다.

코드를 이용한 DI

성재

스프링 빈으로 DI 할 때 구체적인 클래스가 노출된다는 게 무슨 의미인가?

소정

인터페이스를 쓰면 구현한 클래스가 무엇인지는 몰라도 되는데, 이 예제는 직접 클래스를 지정하면서 DI 한다. 즉, 뭘 써야 되는지 알게 되는 걸 뜻하는 것 같다.

민수

책을 보니까 xml에 빈 이름을 직접 써줘서 노출되는 걸 의미하는 것 같다.

주형의 적용 사례

템플릿 콜백

주형

템플릿을 사용한 클래스는 템플릿인걸 명시하고 싶어서 클래스 이름에 template을 붙였다.

근원

어떤 사람은 그렇게 이름 짓는 걸 안 좋아하더라. 이 클래스가 어떻게 작동하는지는 안 나오고 템플릿이라는 것만 명시하는 것 같아서 별로라더라.

길어진 쿼리 처리

주형

회사에서 작업한 쿼리가 엄청 길어서 남들에게 보여주고 싶지 않았다. 그냥 분리해서 을 한 군데로 모았다. 모아놓은 클래스는 public static으로 선언했다. 인스턴스화 되어서 외부에서도 매핑이 가능하게 하기 위함이다.

try-catch 구조

소정

넥스터즈 프로젝트할 때 배민 다니는 분이랑 코드를 짰는데 그분은 if로 throw를 처리하더라. 그래서 그게 실무에서 쓰는 방법인 줄 알았는데 주형이 짜온 코드를 보니 try-catch도 많이 쓰는 것 같다. 어떤 차이가 있나?

주형

try-catch로 하면 좀 더 의미를 담을 수 있다. 자세한 내용은 토비의 스프링 예외처리 단원에 나온다.

성재

에러체이닝이라고 검색하면 나올 것이다.

@sojeongw sojeongw added the Share This issue is about sharing things related with study label Jan 23, 2020
@sojeongw sojeongw changed the title [Share] 3주차 기록 보관소 [Share] 3주차 토론 내용 Jan 23, 2020
@sojeongw
Copy link
Author

이번 주 제일 마음에 와 닿았던 표현은 민수님의

템플릿 메소드 패턴은 고정되어 있는 내용을 재사용 할 수 있게 만들어 같이 쓰는 것
전략 패턴은 다 같이 써야하는 게 있지만 그 안에 바뀌어야 하는 게 있어서 갈아 끼우는 것

입니다. 다른 토론 내용도 다 좋았지만 특히 이 설명이 초심자가 이해하기에 딱 와닿는 표현이어서 좋았어요.

이번주도 여러분에게 많이 배울 수 있어 감사했습니다!

@AgwaB
Copy link

AgwaB commented Jan 23, 2020

그 의미도 맞을 것 같다. MVC 패턴의 서비스가 stateless를 의미하는 것이기 때문이다.

제가 의미 한 것은 MVC 패턴이 아닌 DDD 였습니다!

@sojeongw
Copy link
Author

그 의미도 맞을 것 같다. MVC 패턴의 서비스가 stateless를 의미하는 것이기 때문이다.

제가 의미 한 것은 MVC 패턴이 아닌 DDD 였습니다!

아앗 수정하겠습니다

@hihiboss
Copy link
Member

@als95
민수님이 핵심을 정확히 보시고 짚으신듯 합니다..
역시 소프트웨어공학 연구실이네요 ^^

@sojeongw
도던님 여담으로.. 안드로이드에서 이너클래스도 DI 라이브러리를 쓰면 해결할 수 있을 것 같아요!
코틀린에선 koin이라는 라이브러리가 있는 걸로 압니다!!
자세한건 @boohyunsik 님께서...^^

이번주도 정리해주셔서 감사하고 모두들 수고 많으셨습니다!! 👍

@ttkmw
Copy link

ttkmw commented Jan 25, 2020

정리 감사합니다!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Share This issue is about sharing things related with study
Projects
None yet
Development

No branches or pull requests

4 participants