이끌든지 따르든지 비키든지

분류 전체보기 63

[Design Pattern] LSP(리스코프 치환 원칙)

LSP(Liskov Substitution Principle, 리스코프 치환 원칙)는 SOLID 원칙 중 하나로, 객체 지향 프로그래밍의 설계 원칙에 대한 중요한 개념이다. 이 원칙은 1987년 바바라 리스코프에 의해 처음 제안되어 리스코프 치환 원칙이라 부른다. 리스코프 치환 원칙 (Liskov Substitution Principle) 리스코프 치환 원칙은 "프로그램에서 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체(치환) 해도 프로그램의 정확성에 영향을 미치지 않아야 한다." 는 내용을 정의하는 원칙이다. 이 원칙은 자식 클래스(상속을 받은 클래스)가 부모의 클래스의 동작을 변경하지 않고, 확장해야 함을 말하며, 상속과 다형성을 적절하게 사용하는 방법에 대한 지침을 제공한다 볼 수 있다. ..

[Spring] 스프링 프레임워크 핵심 원리

Spring Framework는 2003년에 처음 출시되었다. 처음에는 복잡한 엔터프라이즈 자바 개발을 단순화하기 위한 목적으로 개발되었으며, 특히 엔터프라이즈 자바 빈즈(EJB)의 복잡성과 무거운 구조를 대체할 수 있는 가벼운 대안으로 등장했다. 주요 특징 1. 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)- 관점을 기준으로 횡단 관심사를 분리해 모듈화 할 수 있다. 2. 제어 역전(IoC, Inversion of Control)- 객체 생성에 대한 제어를 프레임워크에 위임해, 스프링이 객체의 생명 주기를 관리한다. 3. 의존성 주입(DI, Dependency Injection)- 객체 간 의존성을 외부에서 주입해 직접적으로 의존성을 관리하지 않아도 된다.    관점..

Framework/Spring 2023.11.27

[Design Pattern] OCP(개방 폐쇄 원칙)

객체지향적인 프로그램을 설계할 때 가장 중요하고, 반드시 지켜야 할 5가지 원칙이 있다. 각 원칙의 앞글자를 따 SOLID 원칙이라 하는데, 오늘은 두 번째인 개방 폐쇄 원칙(Open-Closed Principle)에 대해 알아본다. 개방 폐쇄 원칙(Open-Closed Principle) 객체는 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다는 원칙을 말한다. 확장에 개방적이다. 여기서 확장이란, 새로운 기능이나 동작의 추가를 말한다. 확장에 개방적이어야한다는 말은 새로운 기능을 추가하거나 기존의 기능을 확장할 때 기존 코드를 수정하지 않고 새로운 코드를 추가할 수 있어야 함을 의미한다. 수정에 폐쇄적이다. 기존의 코드는 수정을 피해야 한다. 기존 코드를 수정하면서 새로운 기능을 추가하거..

[Spring Boot] 기능 기반 패키지 구조(package-by-feature)

선행 지식 : MVC 패턴 (링크) Spring 프레임워크 기반의 앱을 만들 때, 주로 사용하는 패키지 구조가 몇 개 있는데, 계층 기반 패키지 구조(Package-by-Layer), 기능 기반 패키지 구조(Package-by-Feature) 두 가지이다. 기능 기반 패키지 구조란 기능 또는 모듈별로 관련된 클래스 및 패키지를 그룹화하여 구성하는 방식을 말하는데, 아래 예시처럼 account와 admin 기능에 따라 패키지(클래스)를 구성하는 방식이다. 앱의 요구사항이나 특성을 고려해 두 구조 중 하나를 선택하지만, 보통 Spring Boot에서는 테스트 & 리팩토링 용이성, MSA(마이크로 서비스 아키텍처)로 분리되게 쉬움 등의 이유로 기능 기반 패키지 구조를 권장한다고 한다. Controller Co..

Framework/Spring 2023.10.22

[Java] 객체지향 생활 체조 원칙 - 2

(전 글에 이어서 작성) [Java] 객체지향 생활 체조 원칙 - 1SOLID 원칙, 추상화, 다형성···, 객체 지향 프로그래밍(OOP)에 대해 공부할 때 정말 지겹도록 보게 되는 OOP의 특징과 원칙들이 있다. 코드를 객체 지향적으로 작성하려면 이러한 특징들을 지켜야seongho-jo-5.tistory.com6. 줄여 쓰지 않는다.이름이 짧다고 무조건 좋은 것은 아니다. 변수명, 메서드명을 짧게 만들기 위해 보통 단어를 축약하는 방법을 많이 택하지만, 과도한 축약은 오히려 가독성을 떨어트린다. 줄여쓰지 않은 이름이 너무 길다면, 책임을 너무 많이 가져 단일 책임 원칙을 위배하는 것은 아닌지 , 적절한 클래스의 아래에 위치하지 않아 그런 것인지 이유를 생각해보아야 한다. public class Data..

[Java] 객체지향 생활 체조 원칙 - 1

SOLID 원칙, 추상화, 다형성···, 객체 지향 프로그래밍에 대해 공부할 때 정말 지겹도록 보게 되는 OOP의 특징과 원칙들이 있습니다. 코드를 객체 지향적으로 작성하려면 이러한 특징들을 지켜야 하지만, 초보 개발자가 저 원칙들만 보고 코드에 적용하기엔, 개념이 추상적이기에 쉬운 일이 아닙니다.. 객체지향 생활 체조 원칙은 이에 대한 조금 더 구체적인 가이드를 제공한다고 보면 될 듯합니다. 각 원칙과 설명을 읽어보면서 이 원칙이 추구하고자 하는 목표를 생각해 보고 내 코드에 적용한다면 큰 도움이 될 것 같습니다. 객체지향 생활 체조 원칙 한 메서드에 오직 한 단계의 들여 쓰기만 한다. else 예약어를 쓰지 않는다. 모든 원시 값과 문자열을 포장한다. 일급 컬렉션을 쓴다. 한 줄에 점을 하나만 찍는다..

[Git] 좋은 Commit Message

코드 작성에 Code Convention이 있듯이, 깃 커밋 메시지에도 Commit Message Convention과 규칙이 존재하는데, 이 내용을 정리해봤다. Commit Message Convention 커밋 메시지는 제목, 본문, 꼬리말로 구성하고, 각 항목에는 아래의 내용을 작성한다. (※ 중요 : 항목 간의 구분은 한 줄 공백으로!) 제목 : [Commit Type]: [Commit Message][#Issue Number] 내가 코드를 작성한 의도와 짧은 요약을 작성한다. 내 의도를 type으로 명시하고, 내용은 명령조로 작성한다. (마침표는 쓰지 않음! / 영문으로 작성하는 경우 50자 이내, 첫 글자는 대문자로) ■ Commit Type · feat : 기능 추가 · fix : 버그 수정..

Framework 2023.10.16

[정보처리기사] 디자인 패턴

디자인 패턴이란? 소프트웨어 디자인 과정에서 자주 발생하는 문제들을 해결하기 위해 맞춤화할 수 있는 미리 만들어진 청사진(템플릿) 디자인 패턴의 분류 생성 패턴들은 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 메커니즘들을 제공 구조 패턴은 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명 행위 패턴은 객체 간의 효과적인 의사소통과 책임 할당을 처리 생성 패턴의 종류 싱글턴 패턴(Singleton Pattern) 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴 추상 팩토리 패턴(Abstract Factory Pattern) 구상 클래스에 의존하지 않고도 서로 연관되거나 의존적인 객체로 이루어진 제품군을 생산하는 인터페이스를 제공 팩토리 메소드 패..

[JavaScript] 모듈 (import / export)

모듈이란? 코드의 일부를 논리적으로 분리하고 구조화할 때, 각각 분리된 단위를 모듈(Module)이라 한다. 모듈화가 필요한 이유 코드의 재사용 : 비슷한 기능이나 관련된 기능들을 모듈로 분리하여 필요한 곳에서 재사용할 수 있다. 코드의 구조화 : 프로그램을 여러 개의 독립적인 모듈로 나누어 각 모듈이 특정 역할을 담당하도록 분리함으로써 코드의 구조를 개선하고 유지보수를 용이하게 한다. 네임스페이스 관리 : 모듈을 사용함으로써 전역 네임스페이스 충돌을 방지하고 각 모듈에서 정의한 변수, 함수, 객체 등을 별도의 네임스페이스로 유지할 수 있다. 코드의 숨김 : 필요한 기능을 외부에 노출시키지 않고 private하게 유지하여 정보 은닉과 캡슐화를 구현할 수 있다. 모듈 export 모듈을 내보내는 방법은 e..

[TypeScript] 타입 추론 & 타입 단언 & 타입 가드

타입 추론(Type Inference) 타입스크립트는 코드를 작성할 때 변수, 함수, 매개변수 및 반환값 등에 명시적으로 타입을 선언할 수 있다. 그러나 타입을 명시적으로 선언하지 않아도 컴파일러가 코드를 분석하고 타입을 추론할 수 있는데, 이를 타입 추론이라고 한다. function add(a: number, b: number) { return a + b; } const result = add(10, 20); // result가 number 타입일 것으로 추론한다. 예를 들어, 위 코드는 매개변수 a와 b가 number 타입임을 명시했으므로, 컴파일러는 이를 바탕으로 result가 number 타입일 것으로 추론한다. const user = { name: 'John Doe', age: 30, }; co..