[문제점] - 클라이언트 (OrderServiceImpl) 고쳐야함 => OCP를 위반함 - OrderServiceImpl이 DiscountPolicy 뿐만 아니라 구현 클래스 FixDiscountPolicy에도 의존하고 있다 => DIP를 위반함 [해결 방법] - 1. DIP 해결 방법: 인터페이스만 의존 하게 한다 -- => 코드 내에서도 객체 할당 X - 객체 할당 X 에서 생기는 NullPointer Exception 문제 해결 방법: -- => 대신 주입할 얘가 필요하다 [강의 느낀점] - 실제 의존 관계 다이어그램에서 화살표를 보니 의존 관계가 확 와닿는다
질문: - AppConfig의 역할이 너무 광범위 하지는 않을까요? - member service impl 에 주입하는 구체 클래스는 동적으로 runtime 시 정하는 방법도 있을까요? 깨달음: - final 변수를 만들면 기본 할당 또는 생성자를 통해서 할당 되어야 함 - Command + E: 과거 했던 파일들 다보는 방법 => vim: ls [관심사의 분리] - 공연 => 역할의 구현을 누가 정하는가: 기획자 - 기획자 => AppConfig [AppConfig] - 역할 => 구현 생성 => 역할에 설정 => 기획자로서 역할을 갖는 ROLE에 맞는 구현 ACTOR를 배정함 - 역할에 설정 방법: -- 생성자 주입 [Injection] - Injection => 역할에 구체화를 부여 - DIP를 지킨다 => 구현 클래스를 몰라도 된다. ==> 역할인 인터페이스만 의존한다. - OCP를 지킨다 => (closed) 역할을 사용하는 클라이언트가 구현 클래스를 의지 않해서 구현이 바뀔 때마다 수정할 필요가 없다 => (open) 클라이언트 수정 없이 언제든지 추가 구현 클래스를 만들어서 클라이언트에 적용 할 수 있다 - Dependency Injection => 의존 관계 주입 ==> 클라이언트가 의존하는 것을 클라이언트 외부에서 주입
아래와 같이 정리해보았습니다. 혹시 더 필요한 부분이 있을까요? [agile manifesto] 느낀점: - 기준을 제시해주어서 좋다 - 개발 할 때 고려 할 기준: -- 개인의 생각을 중요시하고 상호 교류가 잘 일어나는 것이 중요 -- 문서화 할 시간에 더 나은 제품 -- 고객과 협력에 집중하고 계약 협상에 대한 생각은 나중에 -- 필요에 따른 변화를 우선. 계획에 집착하기보다 [test] 깨달은점: - test 코드 파일 작성 쉽게 가능하다 느낀점: - 아직 SOLID가 안되는 문제점은 말씀해주시지 않았다
질문: - Member Repository가 OrderService와 MemberService 사이에 어떻게 공유 될 수 있을지 => 내 생각: final이 영향을 준다? => 실제 답: repository 내 store가 static으로 선언되어서 그렇다 느낀점: - 단위테스트가 중요하다 => 단위테스트로 점점 쌓아 점점 더 크게 테스트하는 것이다 - 이렇게 역할과 구현을 나눠서 개발만 한 것도 잘한 것이다 => 실무에서 이렇게만 해주는 것을 1차 단계로 해보자
[수업 노트 공유] 깨달음: 1. 단일 설계 원칙을 잘 지켰다: - "Order 생성 시 DiscountPolicy는 나는 모르겠고~ 할 수 있다. 질문: 1. discountPrice가 최종 할인된 가격 맞을까요? - discount 함수는 얼마나 할인 되는지를 알려주는 함수 아닌가요?
< 노트 > 깨달음: 주문 서비스를 하나 둔다 => 주문 생성 서비스 제공하고 => 결과로 주문 결과를 반영 => 주문 결과에는 회원 등급 별 할인 정책에 의한 가격이 들어감 ==> 회원 등급 조회하기 위한 회원 서비스 ==> 할인 정책 적용하기 위한 할인 정책 서비스가 필요함 할인 정책이 하나의 역할이 될 수 있다 => 구현은 정액, 정률. 협력 관계: 역할을 통한 체계 => 재사용: 구현 바꿔서 체계 세부 내용을 바꿀 수 있다
[리뷰] 클래스 다이어그램 => 정적 객체 다이어그램 => 동적 [JUNIT] 배운점: - 사용시 given, when, then 적기 검증: - org.assertj.core.api 쓰기 이제 테스트: - 눈으로 검증 하는 테스트 => 테스트 코드를 통한 검증 [DIP] DIP 위반: => 한개의 클래스 내에서 인터페이스와 구현체 두가지를 의존함
아래 처럼 이해했는데 맞을까요? < 클래스 그림> => 점선: 상속, 실선: 뭔가 사용하는 인터페이스? - 회원 서비스에 하나의 인터페이스 MemberService - 이것의 구현체 MemberServiceImpl 이 있다 - 회원 저장소에 대한 인터페이스 MemberRepository 를 두고 - MemberServiceImpl 은 인터페이스 MemberRepository 를 조작 < 객체 그림> => "new 한 인스턴스 끼리의 참조" - 어떤 MemberRepository 를 쓸지를 나타냄 => 회원 서비스 (impl) 은 메모리 회원 저장소 사용 (MemoryMemberRepository)
깨달음 - OCP, DIP를 지키면 => 스프링 프레임워크를 만들게 됨 정리 - 설계 핵심: 역할과 구현 분리 -- 모든 설계에 인터페이스를 부여하자 --- 추상화란 비용 => 장점 보다 단점이 클 때 ---- 변화 할 것 같다 => 인터페이스. 안변한다 => 구현클래스.
SRP 단일 책임 원칙 - 하나의 책임이라는 것은 모호하다. => 문맥과 상황에 따라 다르다 ==> 책임을 잘 조절하는 것이 묘미 - 기준이란 것은 변경 => 변경이 있을 때 파급 효과가 적도록 OCP 개방-폐쇄 원칙 - 확장: O, 변경: X => 별도의 뭔가가 필요하다 - 핵심: 별도의 뭔가 - 스프링 컨테이너 LSP 리스코프 치환 원칙 - 핵심: 인터페이스 규약을 맞춰야 한다 ISP 인터페이스 분리 원칙 - 핵심: 인터페이스는 잘게 나눠라 => 물론 이것도 너무 잘게 말고. 잘 조절하는 것이 묘미 DIP 의존관계 역전 원칙 - 핵심: (역할) 기능은 인터페이스의 역할 안에서 모두 설명되어야 한다. => 클라이언트는 (구현) 을 모르고 (역할) 만 가지고 해야 한다. ==> 근데, 다형성을 쓰더라도 parent = child 를 대입하여, child 에 의존한다. - 어떻게 해야 해? => spring
영한님 안녕하세요! 입문, 기본편에 이어 따끈따끈한 중급편을 수강중인 수강생입니다. https://openjdk.org/projects/jdk/22/ 위 링크에서 보면 OpenJDK 22버전이 2024. 03. 19에 출시되었습니다. 그래서 IntelliJ 에서도 OpenJDK 22 버전이 기본으로 선택되도록 변경되었더라구요. 정확한 이유는 모르겠지만 OpenJDK 구버전은 UI에서 제공하지 않는 것 같습니다. 강의를 수강하는데 버전업에 따른 문제는 크지 않을 것 같지만, 강의에서는 특정 버전이 명시되어 있어서.. 최신 버전 호환에 대한 말씀은 따로 없으셔서 한번 언급해주시면 좋을 것 같아서 문의 남깁니다! [2024. 03. 28 - 기본 버전이 22] [21버전 선택해도 Oracle OpenJDK 21은 없음]
안녕하세요 선생님 진로 고민과 궁금증이 있습니다. 우선 저는 비전공자입니다ㅠㅠ 백엔드 개발자가 되고싶은데 인터넷에 검색하고 찾아봐도 어떤 순서로 공부를 해야할지 잘 모르겠습니다.. 독학으로 할 생각입니다.. 우선 java를 듣고 spring를 순서로 듣는다고 하는데 python도 들어야한다고 하고 api랑 jpa, DB도 있다고 알아봤습니다. 또 찾아보니 c언어를 먼저 공부하라고 나와있기도 하고.. 오히려 너무 많은 정보로 혼란스럽습니다ㅠㅠ 어떤 걸 먼저 공부하고 순차적으로 어떤 언어와 커리큘럼으로 해야하는지 알려주세요ㅠㅠ 너무 복잡해서 api랑 jpa도 자바랑 같은 언어인건지.. 너무 헷갈립니다. 가야할 길을 알고 갈 수 있게 도와주세요ㅠㅠ
안녕하세요, 대학교 4학년 휴학생입니다. 현재 저의 상태는 프로그래밍 언어로 자바와 mysql db만 조금 다룰줄 아는 상태입니다. 졸업을 하기 위해선 졸작을 준비해야하는데 저의 개인 능력 부족으로 휴학을 한 상태고 휴학하면서 공부를 어떻게 해야할까 하다가 김영한선생님의 강의를 접하게 되었습니다. 그런데 자바 공부만 해봤지 아직 스프링을 해보진 않았지만 졸업작품을 해야하는데 감이 잘 안잡힙니다. 저에겐 6개월이라는 시간이 있는데 개발자님이 만드신 로드맵을 천천히 해보면 졸업작품주제, 졸업작품을 만들수있는 개발 실력이 될까요? 구글이나 네이버 자료를 찾아봐도 잘모르겠고 조금 답답한 마음에 고민을 풀어봅니다.
선생님 안녕하십니까 현직 프론트엔드 개발자로 2년차인 개발자입니다. 선생님 제가 백엔드로 전향하고자 하는 의지가 있어 고민되어 글을 남기게 되었습니다... 현실적으로 공부만 하기엔 돈이 좀 문제이 이기도 해서 선생님 강의로 준비를 해보려고합니다. 부트캠프같은 곳도 좋겠지만 시간 할당을 할수는 없고 일을 쉬는것도 부담인지라 ㅠㅠ 의지는 충만한데 이게 선생님 강의를 가지고 제가 취업을 할 수 있을지 앞으로의 조언이나 그런 방향성에 대해서 듣고싶어 이렇게 글을 남깁니다. 현재 비공자 출신이여서 cs적 공부를 더하고싶어서 현재 방송대 컴퓨터 공학과에도 진학해서 학업 병행중인데 조언 부탁드리겠습니다 ㅠ
일단 저는 안드로이드 앱 개발자를 목표로 하고있어요. 강의 내용에서 자바 스프링이란것이 중요하게 언급되던데 안드로이드 앱개발에도 쓰이는지 궁금합니다. 그리고 이제 무엇을 해야 할지 길을 잃었습니다 ㅠㅠ. 안드로이드 스튜디오로 간단한 앱 만드는 걸 무작정 따라해 보는게 좋을지 ..
public class BOJ_12865 { static int N; static int K; static int[][] merchandise; // 0 : 무게, 1 : 가치 static int[][] dp; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); K = sc.nextInt(); merchandise = new int[N][2]; dp = new int[10000000][N]; for (int i = 0; i < 10000000; i++) { for (int j = 0; j < N; j++) { dp[i][j] = -1; } } for (int i = 0; i < N; i++) { merchandise[i][0] = sc.nextInt(); merchandise[i][1] = sc.nextInt(); } int max = recursion(0, 0); System.out.println(max); } private static int recursion(int index, int weight) { if (weight > K) { return Integer.MIN_VALUE; } if (index == N) { return 0; } if (dp[weight][index] != -1) { return dp[weight][index]; } dp[weight][index] = Math.max(recursion(index + 1, weight), recursion(index + 1, weight + merchandise[index][0]) + merchandise[index][1]); return dp[weight][index]; } 안녕하세요 덕분에 강의 잘 듣고 있는 수강생입니다. 냅색 문제를 풀고 있는데, 최대 가능한 무게의 경우 100 (배낭 물품의 최대 개수) * 100,000(각 물건의 최대 무게) 로 생각보다 생성해줘야하는 배열의 크기가 크더라구요. 그래서 혹시 dp를 1차원 배열로 생성하면 어떻게 되는 지 궁금하여 1차원 배열로 해본 결과, 무게를 고려하지 않고 dp의 무게 갱신을 하게 되어 답이랑은 다르게 나오네요. 혹시 1차원 배열을 시도하려고 할 때 제가 놓치고 있는 부분이 있을까요?감사합니다.