오늘한일
- 스프링 복습
- 알고리즘 문제풀기
- 과제 진행
오늘의 학습 기록 (TIL)
2023년 12월 26일
추가된 기능
- 카드 관리
- 카드 생성 및 수정 기능 추가
- 필요한 경우 카드 삭제 기능 구현
- 댓글 관리
- 댓글 생성 기능 추가
- 댓글 수정 기능 구현
- 댓글 삭제 기능 추가
코드 리팩토링
- getCard 메서드를 도입하여 공통 코드를 추출하여 코드 재사용성 향상
커밋 요약
- feat: 카드 생성/수정
- 카드 생성 및 수정 기능 구현
- feat: 카드 삭제
- 카드 삭제 기능 추가
- Refactor: 공통 코드를 getCard 메서드로 추출
- 공통 코드를 getCard 메서드로 추출하여 리팩토링
- Feat: 댓글 생성
- 댓글 생성 기능 추가
- Refactor: 메서드명 변경 - update에서 updateCard
- 일관성을 위해 메서드명 변경 (update에서 updateCard)
- Feat: 댓글 수정
- 댓글 수정 기능 추가
- Feat: 댓글 삭제
- 댓글 삭제 기능 추가
작성자
오늘의 학습 내용을 간략하게 정리한 TIL입니다. 각 기능의 구현 및 리팩토링 사항이 명확하게 기록되어 있어, 나중에도 쉽게 확인하고 이해할 수 있도록 작성되었습니다.
깃헙주소
https://github.com/NBCamp-10/Trello/compare/dev...feature/card
객체지향 설계 5원칙 SOLID
- 단일 책임 원칙 (Single Responsibility Principle - SRP):
- 클래스는 하나의 책임만 가져야 합니다. 즉, 클래스는 변경되어야 하는 이유는 단 하나뿐이어야 합니다.
- 개방/폐쇄 원칙 (Open/Closed Principle - OCP):
- 소프트웨어의 기능을 확장할 수 있으면서도 수정이 필요하지 않아야 합니다. 기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있도록 설계되어야 합니다.
- 리스코프 치환 원칙 (Liskov Substitution Principle - LSP):
- 어떤 기능에서 파생된 클래스는 그 기능을 사용하는 코드에서 기반 클래스를 대체할 수 있어야 합니다. 즉, 파생 클래스는 기반 클래스의 행동을 변경하지 않고 확장해야 합니다.
- 인터페이스 분리 원칙 (Interface Segregation Principle - ISP):
- 클라이언트는 자신이 사용하지 않는 메서드에 의존해서는 안 됩니다. 즉, 인터페이스는 클라이언트가 필요로 하는 작은 단위로 분리되어야 합니다.
- 의존 역전 원칙 (Dependency Inversion Principle - DIP):
- 고수준 모듈은 저수준 모듈에 의존해서는 안 됩니다. 두 모듈 모두 추상화에 의존해야 합니다. 즉, 추상화된 것은 구체적인 것에 의존하면 안 되며, 구체적인 것이 추상화에 의존해야 합니다.
JDBCTemplate(MySQL), SQLMapper(MyBatis), ORM(JPA) 에 대해 알고 있는가? 장단점?
1. JDBCTemplate:
- 개요: JDBCTemplate은 스프링 프레임워크에서 제공하는 JDBC의 간편한 사용을 위한 클래스입니다. JDBC를 사용하여 데이터베이스에 접근하고 쿼리를 실행하는 데 사용됩니다.
- 장점:
- 간단하고 직관적인 API를 제공하여 개발자가 쉽게 데이터베이스에 접근할 수 있습니다.
- JDBC의 복잡한 부분을 추상화하여 개발자가 더 안전하고 편리하게 사용할 수 있습니다.
- 단점:
- SQL 쿼리의 작성 및 관리는 개발자가 수동으로 해야 하므로, 복잡한 쿼리 또는 객체 매핑이 필요한 경우 코드가 복잡해질 수 있습니다.
2. SQLMapper(MyBatis):
- 개요: MyBatis는 SQL 쿼리와 자바 객체 간의 매핑을 설정 파일을 통해 지정하는 데이터베이스 접근 프레임워크입니다.
- 장점:
- SQL을 직접 작성하므로 세밀한 제어가 가능하며, 복잡한 쿼리를 수행하는 데 용이합니다.
- 동적 쿼리 작성이 쉽고, 기능 확장이 용이합니다.
- 각 SQL 구문에 대한 성능 최적화가 가능합니다.
- 단점:
- 객체-관계 매핑이 필요한 경우, 개발자가 직접 매핑 설정을 해야 하므로 번거로울 수 있습니다.
- JPA와 비교하면 표준화된 인터페이스 및 기능이 부족할 수 있습니다.
3. ORM (JPA - Java Persistence API):
- 개요: JPA는 자바 진영에서 객체-관계 매핑을 위한 표준 인터페이스를 제공하는 스펙입니다. Hibernate, EclipseLink, 등의 구현체가 있습니다.
- 장점:
- 객체와 데이터베이스 간의 매핑을 자동으로 처리해주므로 개발자가 객체 중심으로 개발할 수 있습니다.
- 데이터베이스 종속성이 낮아져서 데이터베이스 교체가 상대적으로 쉬워집니다.
- 트랜잭션 처리, 캐싱, 지연로딩과 같은 기능들을 편리하게 사용할 수 있습니다.
- 단점:
- 학습 곡선이 다소 높을 수 있습니다.
- 복잡한 쿼리를 작성해야 하는 경우 Native Query 등을 사용해야 하며, 이는 JPA의 추상화를 거치지 않고 직접 SQL을 작성해야 하는 것과 비슷한 문제를 야기할 수 있습니다.
WAS, Tomcat, Servlet 등에 대해 알고 있는가?
- 웹 애플리케이션 서버(WAS):
- WAS는 웹 애플리케이션을 실행하기 위한 환경을 제공하는 서버입니다.
- 정적인 콘텐츠와 동적인 콘텐츠를 구별하며, 동적인 콘텐츠를 처리하기 위해 서블릿 컨테이너와 JSP(JavaServer Pages) 컨테이너를 내장하고 있습니다.
- 대표적인 WAS로는 Apache Tomcat, IBM WebSphere, Red Hat JBoss, Oracle WebLogic 등이 있습니다.
- 아파치 톰캣(Tomcat):
- 아파치 톰캣은 오픈 소스의 웹 애플리케이션 서버로, Apache Software Foundation에서 개발 및 유지보수하고 있습니다.
- 톰캣은 자바 서블릿, JSP를 실행할 수 있는 서블릿 컨테이너를 제공합니다.
- 주로 가벼운 웹 애플리케이션을 실행하는 데 사용되며, 많은 자바 웹 애플리케이션에서 널리 사용됩니다.
- 서블릿(Servlet):
- 서블릿은 자바 언어를 기반으로 하는 서버 측 프로그래밍 기술로, 동적인 웹 페이지를 생성하는 데 사용됩니다.
- 클라이언트의 요청을 처리하고, 그에 대한 응답을 생성하여 웹 애플리케이션 서버에서 동작합니다.
- 자바 서블릿은 자바 EE(Enterprise Edition) 스펙의 일부로서, 자바 웹 애플리케이션 개발에서 중요한 역할을 합니다.
간단한 자바 복습
- 객체란 무엇인가?
- 객체 지향 프로그래밍의 가장 기본적인 단위 객체의 범주에는 우리 눈에 보이는 유형의 대상뿐만 아니라 논리, 사상, 철학, 개념, 공식 등과 같은 무형의 대상들도 포함될 수 있다.
- 객체지향 프로그래밍 OOP란 무엇인가?
- 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발 및 설계를 위한 프로그래밍 패러다임 중 하나입니다. OOP는 현실 세계의 개념을 모델링하고, 이러한 모델을 기반으로 프로그램을 구축하는데 중점을 둡니다. 여러 가지 객체들이 상호작용하며 시스템을 구성하는 방식으로 소프트웨어를 구축하는 철학을 나타냅니다.
- 장점:
- 코드 재사용성 (Code Reusability):
- 상속을 통해 코드를 재사용할 수 있어, 이미 작성된 클래스를 확장하거나 수정하지 않고도 새로운 클래스를 만들 수 있습니다.
- 유지보수성 (Maintainability):
- 클래스와 객체의 모델링을 통해 현실 세계를 추상화하므로, 시스템의 유지보수가 쉬워집니다. 변경이 필요한 부분을 찾아내기가 간단합니다.
- 코드의 가독성과 이해 (Readability and Understandability):
- 객체지향 코드는 현실 세계의 개념과 유사하게 모델링되어 있어 가독성이 좋고, 코드를 이해하기 쉽습니다.
- 모듈화 (Modularity):
- 클래스와 객체의 모델링을 통해 소프트웨어를 모듈화할 수 있습니다. 각 모듈은 독립적이고 유연하게 사용될 수 있습니다.
- 유연성과 확장성 (Flexibility and Scalability):
- 다형성, 캡슐화, 상속 등의 특성을 활용하여 코드를 유연하게 확장할 수 있습니다. 새로운 기능을 추가하거나 시스템을 확장하기가 상대적으로 간단합니다.
- 학습 곡선 (Learning Curve):
- 객체지향 프로그래밍은 초보자에게는 학습 곡선이 높을 수 있습니다. OOP의 개념을 이해하고 적용하는 데 시간이 걸릴 수 있습니다.
- 성능 (Performance):
- 일부 상황에서는 절차지향 프로그래밍보다 성능이 낮을 수 있습니다. 특히, 객체지향 프로그래밍에서는 객체 간의 통신이 추가 오버헤드를 발생시킬 수 있습니다.
- 복잡성 (Complexity):
- 프로젝트가 복잡해질수록 객체 간의 관계, 상속 등의 개념을 올바르게 설계하고 유지하는 것이 어려울 수 있습니다.
- 메모리 사용량 (Memory Usage):
- 일부 객체지향 프로그래밍 언어에서는 객체 생성 및 관리를 위한 추가적인 메모리가 소요될 수 있습니다.
- 설계 시간 (Design Time):
- 초기에 객체지향적인 설계를 진행하는 데 시간이 많이 소요될 수 있습니다. 특히, 큰 규모의 프로젝트에서는 설계 과정이 복잡해질 수 있습니다.
- 코드 재사용성 (Code Reusability):
객체지향의 4가지 특성
- 캡슐화 (Encapsulation):
- 캡슐화는 데이터와 해당 데이터를 처리하는 메서드(함수)를 하나로 묶는 것을 의미합니다.
- 클래스 내부에 데이터와 그 데이터를 조작하는 메서드를 함께 묶어 외부에서의 접근을 제어함으로써, 객체의 상태와 행위를 쉽게 관리할 수 있습니다.
- 정보 은닉(Information Hiding)이라고도 불리며, 객체의 내부 구현 세부사항을 감추어 외부에서 직접적인 접근을 통제합니다.
- 상속 (Inheritance):
- 상속은 이미 존재하는 클래스의 속성과 행위를 그대로 물려받아 새로운 클래스를 생성하는 것을 말합니다.
- 코드의 재사용성을 증가시키고, 클래스 간의 계층 구조를 형성하여 유지보수와 확장성을 증가시킵니다.
- 부모 클래스(상위 클래스, 슈퍼 클래스)의 특징을 자식 클래스(하위 클래스, 서브 클래스)가 상속받아 사용할 수 있습니다.
- 다형성 (Polymorphism):
- 다형성은 같은 타입 또는 인터페이스를 구현하는 여러 클래스들이 같은 메서드를 호출할 때 각각의 클래스마다 다르게 행동하는 능력을 말합니다.
- 오버로딩(Overloading): 같은 이름의 메서드가 매개변수의 타입이나 개수를 다르게 받아들이는 것을 의미합니다.
- 오버라이딩(Overriding): 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 사용하는 것을 의미합니다.
- 추상화 (Abstraction):
- 추상화는 객체에서 공통된 속성이나 행위를 추출하여 간추려 나타내는 것을 의미합니다.
- 클래스를 정의할 때 필요한 특징에만 중점을 두고 불필요한 부분을 제거하여 모델링합니다.
- 추상 클래스나 인터페이스를 사용하여 공통된 특징을 정의하고, 실제 클래스에서는 이를 구현하여 사용합니다.
'TIL' 카테고리의 다른 글
231229_TIL (0) | 2024.01.02 |
---|---|
231227_TIL (0) | 2023.12.28 |
231222_TIL (0) | 2023.12.26 |
231221_TIL (0) | 2023.12.22 |
231220_TIL (0) | 2023.12.20 |