켄트 벡이 제시한 단순한 설계 규칙 네 가지(중요도 순) 1. 모든 테스트를 실행한다. 의도한 대로 돌아가는 시스템을 내놓아야 하는데, 의도한 대로 돌아가는지 검증하기 위해 테스트를 시행하고, 이 테스트를 항상 통과하는 시스템을 만들어야 한다. 2. 중복을 없앤다., 3. 프로그래머 의도를 표현한다., 4. 클래스와 메서드 수를 최소로 줄인다. 위의 2~4를 한마디로 표현하자면 리팩터링이다. 코드를 몇 줄 추가할 때마다 잠시 멈추고 새로 추가하려는 코드가 설계 품질을 낮추는지 테스트 케이스로 확인한다. 소프트웨어 프로젝트 비용 중 대다수가 장기적인 유지보수에 들어가는데, 유지보수 개발자가 시스템을 이해하기 쉽도록 하려면 아래의 규칙을 지키면 된다. 1. 좋은 이름을 선택할 것 2. 함수와 클래스 크기를 ..
소프트웨어 시스템은 준비 과정과 런타임 로직을 분리해야 한다. public Service getService() { if (service == null) service = new ServiceImpl(...); return service; } 초기화 지연(Lazy Initialization) 혹은 계산 지연(Lazy Evaluation) 기법 실제로 필요해지기 전까진 객체를 생성하지 않으므로 불필요한 부하가 없고, 어떤 경우에도 null 포인터를 반환하지 않는다. 하지만 의존성의 문제도 있고, 일반 런타임 로직에다 객체 생성 로직을 섞어놓은 탓에 모든 실행 경로도 테스트해야 함. -> 단일 책임원칙을 깬다! 의존성 주입(Dependency Injection) : 사용과 제작을 분리하는 강력한 매커니즘 중..
보시다시피 이렇게 구멍이 뻥뻥 뚫린 잔디밭으로 일일커밋 1일 회고를 작성해도 되는지 모르겠지만 불성실했던 날보다 성실했던 날이 더 많기 때문에 회고를 작성해본다. 일일커밋으로 얻고자 했던 것 내가 벌거벗은 이유는 쉽게 눈에 띄기 위함이고, 내 앞머리가 무성한 이유는 사람들이 나를 보았을 때 쉽게 붙잡을 수 있게 하기 위함이며, 내 뒷머리가 대머리인 이유는 내가 지나가고 나면 다시는 사람들이 나를 붙잡지 못하도록 하기 위함이다. 어깨와 발에 날개가 달린 이유는 그들 앞에서 최대한 빨리 사라지기 위해서이다. 나의 이름은 기회이다. 기회의 신 카이로스 나는 꾸준함이 중요하다고 믿는다. 위 글처럼 기회는 찰나에 왔다 사라지기 때문에 그 기회를 잡기 위해선 평상시에 준비가 되어 있어야 한다고 생각하기 때문이다. ..
www.purin-it.com/spring-boot-oracle Spring BootでOracle接続処理を実装してみた|ITエンジニアとして経験・学習したこと Spring BootのWEBアプリケーションを開発する際、なんらかのデータベースにアクセスすることが多いが、Sprin www.purin-it.com 위 링크를 참고하여 Gradle 프로젝트를 JPA로 Oracler과 연결했다. 1. 사용할 테이블 만들고 확인용 더미 만들어주기 2. 프로젝트 - [lib]폴더에 ojdbc.jar 넣어주기 3. build.gradle에 아래의 코드 추가 dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' complie files('..
학원 수료하고 나서 강제성이 없어서 풀어지기보다 더더욱 열심히 하려고 노력했다. 4월 11일에 스프링 핵심 원리 강의를 끝내고, 취업준비하면서 개인프로젝트도 하는 와중에 스프링 MVC 강의도 틈틈이 들어서 일찍 끝낸 것 같다. 이 강의 같은 경우는 스프링의 MVC 구조에 대해 되게 상세하게 설명해주는데, 난 그 부분은 다시 한 번 들어야할 것 같다... 😅 뷰리졸버까지는 아는데, 핸들러매핑부터 잘 이해가 안 갔다. 그래도 이 강의를 들으면서 스프링에 더욱 익숙해질 수 있었고, Rest API에 대한 이해도 높아졌으니 얻은 게 많다. 이어지는 2편은 5월말에 나온다고 하던데 이제 2편 기다리면서 1편 복습해야지.
www.acmicpc.net/problem/7562 7562번: 나이트의 이동 체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 www.acmicpc.net 이 문제를 처음 보면 어떻게 풀어야 할 지 감이 안 잡힌다. 그러나 잘 생각해보면 BFS를 이용해서 풀 수 있는 문제라는걸 알 수 있다. 나이트가 이동할 수 있는 방향은 왼쪽과 같다. 문제는 이렇게 이동할 수 있는 나이트를 시작위치에서 종료위치로 옮기는 최소횟수를 구하는 것이다. 차례대로 생각을 해보자면, 나이트는 시작위치에서도 저 8개 위치로만 이동할 수 있고, 8개 위치 중 하나를 골라 이동한 뒤에 또 8개 ..
지난 면접에 게시판만들 때 페이징 처리를 어떻게 했는지 물어보셔서 rownum을 사용했다고 했더니 그건 60점짜리 답안이라고, rownum+index가 제일 좋은 답이라고 하셔서 index에 대해 정리해둔다. 인덱스란 데이터베이스에서 데이터 검색 성능의 향상을 위해 테이블 열에 사용하는 객체를 말한다. 특정 행 데이터의 주소를 목록으로 만들어 놓은 것. 인덱스 사용 여부에 따라 데이터를 검색하기 위해 테이블 전체를 스캔하는 Table Full Scan과 인덱스를 사용하는 Index Scan으로 나눈다. 인덱스는 열이 Primary key 또는 Unique key일 경우 자동 생성되지만 직접 특정 열을 지정할 수도 있다. // 인덱스 생성 CREATE INDEX 인덱스명 ON 테이블명(열1 ASC or D..
클래스를 정의할 때, 1. static public 변수 2. static private 변수 3. private 인스턴스 변수 4. public 인스턴스 변수 -> 필요한 경우가 거의 없다. 5. public 함수 6. private 함수는 자신을 호출하는 공개 함수 직후에. 이런 순으로 체계를 잡는다. 추상화 단계가 순차적으로 내려간다. 클래스를 만들 때 유념해야 할 점은 클래스의 크기는 작아야 한다는 것이다. 그렇다면 얼마나 작게 만들어야 할까? SRP에 따라 한 클래스에 하나의 책임이 있도록 해야 한다. 자잘하게 책임을 나누면 큰 그림을 이해하기 어렵다고 걱정하지만, 작은 클래스가 많건 큰 클래스가 몇 개뿐이건 돌아가는 부품의 수는 결국 비슷해진다. 그러므로 큰 상자에 여러 도구를 넣고 쓸 것인지..