💡 좋지 않은 코드가 적은 코드!!!
1) 쓰이지 않는 코드 : 어디선가 쓰일 수 있다는 불안감 때문에 삭제하지 못하는 코드
2) 응급처치를 한 코드 : 다른 로직을 추가해야 하지만 수정으로 인한 side effect가 두려워 함수 내부에 억지로 처리해놓은 코드
1) 코드 간의 의존성을 파악하여 의존성이 잘 드러나는 추상화
2) 일관성 있어 가독성이 좋은 코드 (Naming, Directory 등)
3) 적절히 확장 가능한 설계
💡 현실 세계의 사물들을 객체로 인식하여 그 객체로부터 애플리케이션에 필요한 특징들을 구현하는 방식으로 프로그래밍하는 것
1) 코드의 재사용성 증가 : 자주 사용되는 로직을 라이브러리로 만들어 재사용 가능하고, 신뢰성 확보 가능
2) 라이브러리를 각종 예외상황에 맞게 잘 만들어두면 개발자의 사소한 실수로 인한 에러를 컴파일 단계에서 잡아낼 수 있기 때문에 버그 발생이 감소
3) 개발자는 내부에서 어떻게 동작하는지 몰라도 라이브러리가 제공하는 기능들을 사용할 수 있기 때문에 생산성 향상
4) 객체 단위로 코드가 나뉘어 작성되기 때문에 디버깅이 쉽고 유지보수에 용이
5) 데이터 모델링을 할 때 객체와 매핑하기 쉬워 요구사항을 명확하게 파악 가능
1) 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생
하드웨어의 발전으로 많이 보완되었다!
2) 객체가 변수를 통해 예측할 수 없는 상태를 갖게되어 애플리케이션 내부에서 버그를 발생시킬 수 있다.
함수형 프로그래밍 패러다임 등장
클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
매우 짧은 개발 사이클의 반복에 의존하는 소프트웨어 개발 프로세스
요구되는 새로운 기능에 대한 자동화된 테스트케이스와 해당 테스트를 통과하는 가장 간단한 코드를 작성하여 상황에 맞게 리팩토링하는 과정을 거친다.
테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
각각의 테스트는 독립적이며 서로 의존해서는 안된다.
어느 환경에서도 반복 가능해야 한다.
테스트의 결과는 성공 또는 실패(Boolean)로 자체적으로 검증 가능해야 한다.
테스트는 적시(테스트하려는 실제 코드를 구현하기 직전)에 구현해야 한다.
새로운 기능을 추가하기 전에 테스트를 하여 잘 작동하는지 빠르게 확인할 수 있다. 테스트를 작성하기 위해 개발자는 해당 기능의 요구사항과 명세를 분명히 이해하고 있어야 한다.
새로운 기능을 추가하면 잘 작동하던 기능이 제대로 작동하지 않는 경우가 발생할 수 있다. 새로운 기능을 추가할 때 테스트 코드를 작성함으로써, 새로운 기능이 제대로 작동함과 동시에 기존의 기능들이 잘 작동하는지 테스트를 통해 확인할 수 있다.
코드의 양이 방대해지면 작은 코드로 나누는 리팩토링이 필요해진다. 이때 테스트 코드를 통해 나누어진 기능들이 잘 작동하는지 테스트 할 수 있어 리팩토링 속도가 빨라지고, 코드 퀄리티도 향상된다.
테스트 코드를 작성하기에 시간이 촉박한 상황(코드 퀄리티보다 빠른 생산성이 요구되는 경우)에서는 TDD가 어려울 수 있다.
어떠한 부분을 어떤 테스트 프레임워크를 사용하여 어떻게 테스트해야 하는지 등에 대한 학습이 필요하고 익숙해져야 한다.
기능에 대한 테스트 코드 작성에 어려움이 있거나 생각지 못한 예외 케이스가 존재하는 경우 애플리케이션 코드보다 테스트 코드에 대해 고민하게 될 수 있다. 모든 코드에 대해 테스트 코드를 작성할 수 없다. 테스트 코드가 모든 버그를 해결해줄 수는 없다.
Java8부터 함수형 프로그래밍 지원
함수형 프로그램은 기본적으로 한 번 값이 변수에 할당되고 나면 이후에 값이 변경되지 않기 때문에 부수효과(Side Effect)가 발생하지 않는다. 이러한 프로그램을 참조 투명성을 가진다고 말한다. 참조 투명성을 가지는 함수형 프로그래밍은 멀티 코어 프로세스에서 교착 상태에 빠지지 않는다는 장점이 있어 동시성 프로그래밍에서 강력한 프로그래밍 패러다임으로 작용한다.
함수형 프로그래밍 패러다임을 따르고 있는 언어에서의 함수는 일급 객체로 간주된다.
💡 함수를 일급객체로 다룰 수 있도록 해주는 Functional Interface(단 하나의 추상 메서드를 가지는 인터페이스)를 통해 코드의 재활용 단위가 클래스였던 것이 함수 단위로 바뀌면서 조금 더 유연한 개발이 가능해졌다!
애플리케이션의 정보, 데이터를 나타내는 객체로, 비즈니스 로직을 구현하는 영역
사용자가 요청한 화면을 보여주기 위해 모델로부터 데이터를 얻어오는 영역
클라이언트의 요청사항을 파악한 후 그 요청에 맞는 데이터를 Model에게 요청하고, 그 데이터를 View에 반영하여 사용자에게 전달
출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Development_common_sense
https://jbee.io/etc/what-is-good-code/
https://velog.io/@estell/REST-API-6%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99
https://meetup.toast.com/posts/92
https://mangkyu.tistory.com/182
https://tecoble.techcourse.co.kr/post/2021-09-30-java8-functional-programming/
https://medium.com/@jooyunghan/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%86%8C%EA%B0%9C-5998a3d66377
https://cocoon1787.tistory.com/733
https://asfirstalways.tistory.com/180