컨테이너에 등록된 모든 빈 조회 빈 이름으로 조회할 경우 @Test @DisplayName("빈 이름으로 조회") void findBeanByName() { MemberService memberService = ac.getBean("memberService", MemberService.class); //MemberService, 즉 인터페이스로 조회함 그러면 이 인터페이스의 구현체가 대상이 된다 assertThat(memberService).isInstanceOf(MemberServiceImpl.class); //isInstanceOf() 연산자:해당 타입의 인스턴스인지를 비교하는 메서드, 객체가 특정클래스나 인터페이스로부터 생성된 것인지를 판별 } 멤버서비스가 멤버 서비스 인플의 인스턴스면 성공 구체 ..
분류 전체보기
관심사 분리 MemberApp 변경전 public class MemberApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); Member member = new Member(1L, "memberA", Grade.VIP); memberService.join(member); Member findMember = memberService.findMember(1L); System.out.println("findMember = " + member.getName()); System.out.println("findMember = " + findMember.getName()); } } 변경코드..
풀이 시간복잡도는 원소 삽입 O(N), indexOf 메서드 사용할때 O(N), 큐 회전 O(N) 시간 복잡도 O(N^3) N이 최대 50이니까 50*50*50=125000 이다 코드 /** 3주차 * 1.BOJ 1021 * 2.덱 * 3.양방향으로 원소를 추가/삭제한다는 점, 끝에 있는 원소들만 추가/삭제하지 중간에 있는 원소들은 건드리지 않는다는점, * 덱을 이용했지만 덱의 내장함수로 인덱스를 구할 방법이 없는 것 같아서 링크드리스트 사용함 * 4.O(N^3) */ /** 배운점 * 1.덱을 STL로 구할거면 Deque deque = new LinkedList() 만 생각했는데 이번에 내장함수 사용을 위해 * LinkedList를 사용해서 문제를 푸니 고정된 사고를 벗어날 수 있었다. * 2.인덱스를..
바킹독 개념 정리 덱 정의 덱은 양쪽 끝에서 삽입과 삭제가 전부 가능하다 어떤 쪽으로 입력하고 어떤 쪽으로 출력하느냐에 따라서 스택(Stack)으로 사용할 수도 있고, 큐(Queue)로도 사용할 수 있다. 덱의 성질 덱의 구현 덱은 배열로 구현하는게 쉽다. head는 가장 앞에 있는 원소의 인덱스이고 tail을 가장 뒤에 있는 원소의 인덱스 + 1이다 덱은 양쪽에서 모두 삽입 가능하기 때문에 양쪽으로 확장해야한다. 시작지점을 0으로 잡으면 왼쪽으로 확장할 수 없게 된다. 시작 지점을 배열의 중간으로 둬야한다. 그래서 배열의 크기는 2*MX+1이고 head와 tail의 초기값은 MX이다 여기까지가 배열로 덱을 구현하는 방법이었고 STL로 구현하는 방법을 알아보겠다. JAVA의 덱 자바에서의 덱은 인터페이스..
비지니스 요구사항과 설계 회원 도메인 협력 관계 : 기획자들도 볼 수 있다. 회원클래스다이어그램 (정적): 회원 도메인 협력 관계를 분석해서 만든것 회원 클래스 다이어그램은 서버를 실행하지 않고 클래스들만 분석해서 볼 수 있는 그림 db 구현체를 넣을지 외부 구현체를 넣을지 결정하는건 동적으로 결정하기 때문에 클래스다이어그램으로 판단하기 어려움 그래서 객체 다이어그램(동적)을 만든다 빌드하면 main에 대한 코드만 나가고 test 코드는 빌드될때 빠진다. 회원 도메인 실행과 테스트 순수 자바 코드로 테스트하기 public class MemberApp { public static void main(String[] args) { MemberService memberService = new MemberServ..
좋은 객체지향 설계의 5가지 원칙(SOLID) SRP 단일 책임 원칙 한 클래스는 하나의 책임만 가져야한다 중요한건 변경이다. 변경이 있을때 파급효과가 적으면 단일 책임 원칙을 잘 따른것 OCP 개방-폐쇄 원칙 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야한다 => 다형성 활용 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 아래는 멤버서비스에서 메모리멤버리포지토리를 Jdbc 멤버리포지토리로 갈아끼우려고 하는 상황이다. 두번째 코드를 보면 다형성만 사용하면 OCP 원칙을 지킬 수 없다. 구현 객체를 변경하려면 클라이언트 코드를 변경해야하는 문제가 생긴다. LSP 리스코프 치환 원칙 차를 만든다고 했을때 인터페이스에서 엑셀 기능을 속도를 올리는 것으로 규정을 했다면 구현..
바킹독강의 큐 정의 한쪽 끝에서 원소를 넣고 한쪽 끝에서 원소를 뺄 수 있는 자료구조 먼저 들어온 원소가 먼저 나오게 된다 FIFO 큐 성질 4번은 원칙적으로 불가능하지만 배열로 만들면 구현은 가능하다 큐는 배열로 구현하면 쉽다. 구현 원소를 넣으면 tail이 한 칸 올라감 55 원소를 뺀다고 하면 head를 한 칸 올리면 된다. 굳이 0번지에 있는 55를 덮을 필요 없다 배열에서 dat[head]부터 dat[tail-1]번지가 바로 큐의 원소들이 들어있는 자리 큐의 크기는 tail - head push 하면 tail이 증가하고 pop하면 head가 증가된다 큐를 삽입 삭제하게 되면 점점 오른쪽으로 밀려나가게 된다. 그러면 배열이니 앞의 공간을 못쓰게 된다 해결방법:원형으로 만들기(원형 큐) head나 ..
바킹독 스택 개념을 보고 정리한 글입니다 스택 스택은 먼저 들어간 애가 나중에 나오는 구조다 FILO 구조 스택의 성질 1.원소의 추가가 O(1) 2.원소의 제거가 O(1) 3.제일 상단의 원소 확인이 O(1) 4.제일 상단이 아닌 나머지 원소들의 확인/변경이 원칙적으로 불가 스택 구현 배열, 연결리스트로 구현 가능 스택을 배열로 구현할 때는 원소를 담은 큰 배열 한 개와 인덱스를 저장할 변수 한 개만 필요하다. pos 값이 스택의 길이, 즉 스택 내의 원소의 수를 의미함 push 함수 pos 값 +1 증가 pop 함수 pos값만 1 줄이면 된다. 나중에 원소를 넣는다면 arr[pos]에 원소가 들어가면서 알아서 값이 바뀐다 top 함수 제일 위의 원소를 확인하는 top 함수다 STL stack을 쓸 수..
AOP가 필요한 상황 모든 메소드의 호출 시간을 측정하고 싶다고 해서 메소드에 다 추가해버리면 다음과 같은 문제 생긴다. 1.핵심 관심사항이 아니다 2.공통 관심사항이다. 3.시간 측정 로직과 비지니스 로직이 섞여 유지보수가 어렵다. 4.시간을 측정하는 로직을 별도의 공통 로직으로 만들기 어렵다. 해결 방법 : AOP 적용하기 공통 관심 사항과 핵심 관심사항을 분리하고 원하는 곳에 공통 관심사항을 적용하면 된다. 기존 의존 관계 가짜 멤버 서비스를 만들어서 시간 측정을 하고 joinPoint.proceed()를 통해서 실제 멤버 서비스를 실행한다. AOP 적용 후 전체 그림은 이렇게 된다. 실제로 Proxy가 주입되는지 콘솔에 출력해보면 아래처럼 가짜 멤버서비스가 만들어짐을 알 수 있다. AOP를 스프링..
H2 데이터베이스 설치 sql문 generated by default as identity null 값이 들어오면 자동으로 id 세팅해줌 팁:sql ddl을 sql 파일을 만들어 관리한다. 순수 JDBC 자바가 DB랑 붙으려면 JDBC가 꼭 있어야한다 이번 강의에서는 과거에 사용하던 방식으로 구현을 했다. JdbcMemberRepository public class JdbcMemberRepository implements MemberRepository { private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } 스프링부트가 데이터소스(접속정보)를..