객체 설계 (클래스 분리) 메서드 분리만 잘해도 클린코드를 어느정도 만들 수 있다. 특히, 함수를 한가지 일만 하도록 분리하는걸 최우선으로 하는게 좋다! 이게 익숙해진다면 그 다음으로 클래스 분리로 넘어간다. 근데 클래스 분리( = 객체설계)가 메서드 분리보다 훨씬 어렵다. 객체 설계와 관련한 조언들 객체의 역할, 책임, 협력을 고려하면서 객체 설계 역할, 책임, 협력이란 무엇인가? 객체 설계 5원칙 SOLID를 지키면서 객체 설계 유지보수 하기 좋도록 객체 설계 "응집도는 높이고, 결합도는 낮춘다!" 원칙으로 객체 설계 이런 여러가지 조언들이 있지만 실제 현장에서 해당 원칙을 기반으로 객체 설계하기란 쉽지 않다. (물론 깊이 있게 고민하고 의식한다면 조금씩 나을 수 있지만, 조금이라도 의식하지 못한다면..
기능 요구사항 각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. 자동차 이름은 쉼표(,)를 기준으로 구분한다. 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다. 단위 테스트, TDD를 시작할 때의 감정 상태 TDD → 어디서, 어떻게 시작해야할 지 모르겠고, 막막하고 어렵다. 자동차 경주게임, 앞으로 진행할 로또, 사다리타기 미션들은 실무와 비슷하다. 물론 실무보다는 요구사항이 명확한 상태에서 TDD를 진행할 수 있는데, 실무로 가면 요구사항이 명확하지 않은데, TDD로 개발해야할 상황이 오게 된다. 객체 설계도 해야하고.. 어렵다. 막막하다.. 구현후 자동화된 테스트를 만드는건..
이번에 nextstep에서 열리는 TDD, CleanCode Java 14기에 참여하게 되었다. 좋은 교육기관에서 제대로 미션을 수행하며 TDD와 클린코드, 리팩토링을 찐하게 맛보고 성장하고 싶다..! TDD에 집착하는 이유 TDD(Test Driven Development, 테스트 주도 개발) → Kent Beck(켄트 백) TDD란 프로그래밍 의사결정과 피드백 사이의 간극을 의식하고 이를 제어하는 기술이다. 웹 어플리케이션을 기준으로 피드백을 받는 과정을 생각해보면 UI부터 데이터베이스 테이블까지 만들고 CRUD까지 만들고 피드백을 받기까지 엄청 오랜 시간이 걸린다. 하지만 TDD는 엄청 빠른 시간내에 피드백을 받을 수 있다. TDD의 아이러니 중 하나는 테스트 기술이 아니라는 점이다. TDD는 분석..
객체를 생성하는 방법 (인스턴스화) public 생성자 public static 팩토리 메소드 ⇒ 아이템 1에서 다룬 내용. 근데 위 2가지 방법은 객체의 선택 필드가 많아질수록 적절히 대응하기 어렵다. 참고 : 필수, 선택 필드를 임의로 정하여 생성자, 정적 팩토리 메소드를 사용할 수 있다. 하나씩 예를 들어보자. 점층적 생성자 패턴 (telescoping constructor pattern) public class NutritionFacts { private final int servingSize; // (ml, 1회 제공량) => 필수 private final int servings; // (회, 총 n회 제공량) => 필수 private final int calories; // (1회 제공량당) ..
객체를 생성하는 방법 (인스턴스화) public 생성자 public static 팩토리 메소드 정적 팩터리 메서드가 생성자 보다 좋은 장점 5가지 생성자 : 생성자가 제공하는 파라미터와 그 반환 객체를 잘 설명하지 못할 수 있음 ⇒ 정적 팩터리 메서드 : 잘 만든 이름을 가질 수 있도록 만들 수 있다. public class Foo { String name; public Foo(String name) { this.name = name; } public static Foo withName(String name) { // 이름을 가질 수 있다. return new Foo(name); } public static void main(String[] args) { Foo foo = new Foo("hyungwoo..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. 엔티티 매핑 객체와 테이블 매핑 : @Entity, @Table 필드와 컬럼 매핑: @Column 기본 키 매핑: @Id 연관관계 매핑: @ManyToOne, @JoinColumn 1. 객체와 테이블 매핑 @Entity @Entity가 붙은 클래스는 JPA가 관리함. 엔티티라고 부른다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수로 써야함 💡 주의 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final 사용 X @Entity 속성 속성 : name JPA에서 사용할 엔티티 이름을 지정한다. 기본값: 클래스 이름을..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. 영속성 컨텍스트란? 💡 영속성 관리 (JPA 내부 구조) JPA를 이해하기 위해 영속성 컨텍스트를 이해해야 함 JPA에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 (Object Relational Mapping) 영속성 컨텍스트 EntityManagerFactory와 EntityManager 1. EntityManagerFactory JPA는 EntityManagerFactory를 이용하여 entity를 관리한다. 어플리케이션 로딩 시점에 DB당 딱 하나만 생성되야 한다. WAS가 종료되는 시점에 EntityManagerFactory를 닫는다. 2. EntityManager 트랜잭션이 수행되는 단위마다 생성한다. 즉, 고객의 요청이 들어올..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. JPA 시작하기 전에.. JPA - 프로젝트 생성 H2 데이터베이스 최고의 실습용 DB이다. 가볍다. (1.5MB) 웹용 쿼리툴 제공한다. MySQL, Oracle 데이터베이스 시뮬레이션 기능을 제공한다. 시퀀스, auto increment 기능 지원한다. 간단하게 db를 띄우지 않고 메모리로 실행할 수도 있다. 데이터베이스 방언 JPA는 특정 데이터베이스에 종속 X 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다. 가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2 문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), Oracle은 SUBSTR() 페이징 : MySQL은 LIMIT, Oracle은 ROW..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. JPA란? JPA(Java Persistence Api) = 자바 진영의 ORM 기술 표준 ORM (Object Relational Mapping) = 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크가 객체와 관계형 데이터베이스 중간에서 매핑해줌 대중적인 언어에 대부분 ORM 기술이 존재함 (ex : typescript도 type orm으로 제공한다.) 📕 어플리케이션과 JDBC 사이에서 동작한다. ⛏ JPA 동작 - 저장 ⛏ JPA 동작 - 조회 JPA 소개 [History] EJB-엔티티 빈 (자바 표준) -> 하이버네이트 (오픈 소스) -> JPA(자바 표준) 💻 JPA는 표준 명세 JPA는 인터페이스의 모음이다. (껍데기) JP..
💡 인프런의 김영한 선생님 강의를 정리한 글입니다. 객체 지향 언어와 관계형 데이터 베이스 객체 지향 언어를 이용한 애플리케이션은 보통 관계형 데이터 베이스에서 관리한다. 그러다 보니 SQL 중심적인 개발이 주를 이루게 된다. (CRUD → 지루한 코드를 무한 반복 함) 예를 들어 회원 객체를 만들었다면, 그에 해당하는 SQL을 짜게 되는데 만약 개발하다가 필드가 추가되면 짜놓은 SQL 쿼리들을 하나씩 다 수정해야 한다.. 즉, SQL에 의존적인 개발을 피하기 어렵다. 또, 객체와 관계형 데이터 베이스 사이의 패러다임의 불일치가 발생한다. 🤔 객체를 어떤 저장소에 보관해야 할까? RDB, NoSQL, FILE 등이 있는데, 현실적으로 FILE에 넣으면 검색을 할 수 없다. NoSQL은 대안이 될 수 있지..
환경 : gradle + spring boot로 실습 (https://github.com/Wu22e/toby_spring) ㅇㅁㅇ ㅁㄴㅇㄹ ㅁㄴㅇㄹ ㅁㄴㅇㄹㅁㅇ 1234 1234 1234 1234 1234 1234 asdsadasdasd adsfasdf const a = 1 스프링 → 자바를 기반으로 한 기술 스프링이 가장 관심을 많이 두는 대상은 오브젝트 오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 "설계"로 발전하게 됨. 그 설계라는 것은 우리가 흔히 말하는 객체지향 설계이며, 이는 디자인 패턴, 리팩토링, 단위 테스트와 같은 여러 응용 기술과 지식이 요구된다. 🏅 1.1 초난감 DAO DAO(Data Access Object)는 DB를 사용해 데이터를 조회하거나 ..
이번에는 gradle, mvn에 더해 spring boot cli를 git bash에서 사용하기 위한 설치 과정을 정리하고자 글을 남긴다. git bash에 기본적으로 spring 키워드가 설치되어 있지 않기에 다음과 같은 설치 과정을 거쳐야 한다. 1. 스프링 공식 홈페이지에서 spring boot cli 압축파일을 다운받는다. https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.installing.cli 2. 압축한 폴더를 환경변수로 설정해 둔다. 어떤 경로로 해도 상관없지만 나는 SPRING_HOME 이라는 변수를 만들어서 C:\spring 폴더에 넣었다. 그렇게 되면 실제..