소개
호주에 살고 있는 소프트웨어 개발자입니다. 30년간 다양한 분야의 시스템과 서비스를 개발해본 경험이 있습니다.
스프링 프레임워크와 관련 기술을 좋아하고 JVM 기반 언어를 주로 사용합니다.
한국스프링사용자모임(KSUG)을 설립하고 활동했고, 토비의 스프링이라는 책을 쓰기도 했습니다.
개발과 관련된 다양한 주제에 관해 이야기하는 것을 좋아합니다.
강의
전체3수강평
- 감사합니다.
bigth
2024.07.26
1
- 자세한 이야기와 코드 리펙토링을 통해서 얻어가는것이 많았습니다.
유승현
2024.07.25
1
게시글
질문&답변
2024.07.26
의존성역전에 대해서 질의 합니다.
답변 작성을 하는데 줄바꿈이 적용되지 않고 계속 붙어나와서 여러번 지우고 다시 달았습니다. 혹시 중간에 알림을 여러번 받으셨다면 죄송합니다. 인프런 문제인지 제 브라우저 환경 문제인지 모르겠지만 갑자기 이상하네요.
- 0
- 3
- 67
질문&답변
2024.07.26
의존성역전에 대해서 질의 합니다.
좋은 질문을 해주셨네요. 아마 다음 강의에서 아키텍처 얘기를 하면 이걸 설명드리게 될 것 같은데, 질문을 해주셨으니 말씀을 드릴게요. DIP에서 의존성 역전을 하는 이유는 애플리케이션의 중심이 되는 도메인/비즈니스 로직을 가진 가장 상위 모듈이 기술적인 메카니즘을 다루는 변경 가능성이 높은 하위모듈에 의존하지 않게 만드는 것이 목적입니다. 보통 서비스 계층과 이 안에서 다루는 도메인/엔티티 오브젝트가 가장 중심이 되는 상위 모듈이라고 보면 됩니다. 데이터를 다루거나, API 등 외부 서비스를 이용하는 부분에 DIP를 적용하면 인터페이스 소유권까지 역전하는게 맞습니다. 그런데 웹 컨트롤러와 같이 사용자 또는 클라이언트와 연결이 되고 주로 UI/Web 등을 담당하는 계층은 의존관계가 그대로 일반적인 아키텍처 그림에서 아래로 내려가는 것이 맞습니다. 그래서 컨트롤러가 있는 웹 계층과 서비스 계층에는 DIP를 적용하지 않습니다. 이걸 일반화하면 많이 얘기되는 클린 아키텍처 혹은 헥사고날 아키텍처 그림이 됩니다. 가장 중심이 되는 도메인/애플리케이션 레이어가 가운데 있고, 변경 가능성이 높은 웹/UI와 데이터/인프라 계층이 그 밖에 있는 구조가 되죠. 그래서 모든 의존성이 가장 중요한 중심으로 향하게 됩니다. 간단히 웹 - 서비스 - 데이터, 이렇게 세 가지 계층을 가지고 있다면 일제 요청의 흐름을 기준으로 만든 일반적인 코드는 코드의 의존성이 다음과 같이 되죠. 웹 -> 서비스 -> 데이터 여기서 도메인 로직을 가지고 있는 서비스가 가장 중요하고, 가장 상위(정책, 로직) 모듈이므로 의존관계가 서비스가 중심인 것으로 바뀌게 됩니다. 웹 -> 서비스 이게 클린 아키텍처라고 하는 것이죠. 이러면 중요한 애플리케이션 로직이 앞에서 웹 요청을 어떤식으로 받아서 처리하는지, 응답을 어떻게 만드는지, 혹은 뒤에서 데이터를 어떻게 저장하고 읽어오고 인프라 기술을 사용하는지에 영향을 받지 않고 안정적인 구조가 됩니다. 애플리케이션 전체 구조에서 이걸 잘 설명하면서 전체 애플리케이션을 완성해보는 강의를 준비중입니다.
- 0
- 3
- 67
질문&답변
2024.07.24
자바 버전
시스템에 기본으로 설치해둔 JDK와 환경변수 등은 자바 프로그램을 직접 실행하는 경우에 중요합니다. 실행 가능한 jar 애플리케이션을 클릭해서 실행하거나 커맨드라인 등에서 java ClassName으로 실행하거나, 아니면 IDE 같은 애플리케이션이 JDK/JRE가 미리 설치된 상태에서만 실행이 된다면 더더욱 그렇죠. 예전에는 최신 버전 자바 하나로 자바를 이용하는 애플리케이션도 돌리고, 프로젝트도 같은 버전으로 개발했지만 요즘은 프로젝트마다 다른 버전을 사용하기도 해서 프로젝트 레벨에 맞는 JDK를 따로 설치하고 이를 사용하게 만들어야 해서 상황이 복잡해졌습니다. JDK 8, 11, 17, 21과 같은 LTS 버전을 다 설치하고, 프로젝트에서 어떤 걸 쓰냐에 따라서 해당 프로젝트를 실행할 때 선택한 JDK를 이용하게 하는 거죠. 이러려면 시스템의 "디폴트"로 설치해둔 JDK 버전과 JAVA_HOME 등을 무시하고, 새로운 JDK 링크 등을 이용해서 프로젝트를 실행할 때의 java 프로그램 위치와 라이브러리 위치 등을 매번 다르게 지정해야 합니다. 그런데 요즘 많이 쓰는 IDE는 이런 작업을 매우 편리하게 해주도록 JDK 관리와 프로젝트마다 선택을 하기가 편리합니다. 그래서 굳이 시스템 레벨에 JDK를 설치하지 않아도 될 것 같은데, 실제로는 필요합니다. 두 가지 이유 때문인데요. 하나는 IntelliJ를 포함해서 대부분 자바 프로젝트들이 사용하는 빌드 시스템인 Gradle은 원래 IntelliJ와 상관없이 밖에서 동작하는, 실행을 한다면 커맨드라인에서 직접 실행하는 방식으로 써야 합니다. IntelliJ에서 테스트나 애플리케이션을 실행하면 사실 뒤에서 Gradle이 따로 돌아가거든요. 프로젝트 셋업 수업에서 제가 설명했듯이 그래서 Gradle의 JDK 버전도 따로 설정을 해야 하는데, 요즘엔 프로젝트 버전을 따라가도록 만들어서 크게 신경을 쓰지 않기도 합니다. 하지만 여러가지 필요에 따라 터미널 모드로 들어가 혹은 커맨드라인에서 Gradle 명령을 실행해서 테스트나 애플리케이션 실행을 하기도 합니다. 이럴 때는 현재 시스템의 JDK를 이용하게 되어서 그때 JDK 버전을 맞춰줘야 합니다. 프로젝트를 17로 했는데, 터미널에 가니 11버전이 현재 설정으로 되어있으면 시스템의 path와 JAVA_HOME 등을 수정해주고 실행을 해야 합니다. 또, Gradle 외에도 스프링 부트 앱을 IDE 밖에서 실행한다거나 lint 같은 각종 외부 프로그램을 실행할 때도 시스템에 직접 설치한 JDK를 사용하게 됩니다. 그래서 이 버전을 잘 맞추고 변경하는 것을 할 수 있어야 됩니다. 안 그러면 버전이 안 맞아서 에러가 나기도 하죠. 제가 sdkman이라는 도구를 추천하는 이유는 이렇게 터미널에서 JDK 버전을 변경하는 작업을 아주 간단한 명령으로 손쉽게 하도록 도와주기 때문입니다. 또 새로운 JDK가 나왔을 때 이를 설치해두는 것도 도와주죠. 요즘은 같은 버전도 여러 JDK 배포판이 있어서 이를 변경해서 사용할 수도 있습니다. 더 궁금하신 게 있으면 또 질문을 남겨주세요.
- 0
- 1
- 91
질문&답변
2024.07.21
섹션3 학습테스트 시간 비교테스트 질문입니다.
now()를 두 번 따로 실행을 했다면 실행 순간의 현재 시간을 가져오는 것이니 dt1, dt2는 조금이라도 차이가 나는게 분명하다는 것을 보여주려고 만든 간단한 학습 테스트였습니다. 일반 Clock을 사용한다면요. 그래서 저는 항상 dt2가 마이크로세컨드 단위에서 dt1과 얼마간 차이 나는 값이 나오고 그래서 테스트는 항상 성공을 했거든요. 아무리 빠른 CPU라고 하더라도 분명 차이가 나는게 분명한데, 지금 보여주신 에러 메시지를 보면 dt1, dt2에 나노초 단위까지 동일한 값이 들어가네요. 음.. 생각해보지 못했던 결과라 이상하긴 한데 코드를 보면 문제는 없어보이고요. 다른 Mock 툴을 이용해서 LocalDateTime.now ()의 결과 값을 강제로 고정시킨 경우가 아니라면.. 무슨 이유일까요. 한 가지 확인을 해보고 싶은데요. 혹시 이 테스트 코드의 asssertThat 앞에 for-loop를 30번 정도 돌면서 LocalDateTime.now (clock)을 실행한 결과 값을 print 해보실 수 있을까요? 어떻게 결과가 나오는지 궁금합니다. 그와 다르게 dt1, dt2를 생성하는 중간에 Thread.sleep(1) 정도만 넣어주었을 때는 어떤 결과가 나오는지도 궁금합니다. 그리고 테스트 하신 OS 와 사용하시는 시스템 종류도 알려주시면 좋겠습니다. 요청드린 결과를 보여주시면 그 다음 추리를 해보도록 하겠습니다. 시간을 다루는 건 역시 쉽지 않네요.
- 0
- 1
- 93
질문&답변
2024.07.20
공부한 내용을 개인 블로그에 정리해서 올려도 될까요?
안녕하세요. 공부하신 것 중에서 꼭 공유하고 싶은 내용을 정리해서 개인 블로그에 올리셔도 됩니다. 다만 내용 대부분을 그대로 넣으시면 그건 곤란하겠죠. 가능하면 공부하시면서 느끼신 점을 많이 적어주시면 보시는 분들에게 도움이 될 것 같습니다. 이왕이면 강의를 직접 수강하고 싶게 해주시면 좋겠죠. 😊 일부 스크린샷을 올리시는 것은 괜찮습니다만, 수강생에게만 공개되는 강의 파일은 공유하시면 안 됩니다. 인프런의 정책도 있기도 해서 역시 주요 내용을 그대로 다 올리지는 말아주세요. 그리고 꼭 출처를 남겨주세요. 강의 링크도 부탁드립니다. 감사합니다.
- 0
- 1
- 141