전체 글 106

의존관계 주입(DI)을 통해 DIP, OCP 문제를 해결하자

이 글은 김영한 강사님의 강의와 자료를 학습한 뒤 정리하는 글입니다 생성자 주입으로 어떻게 DIP를 지키는지 보자. public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } public OrderService orderService() { return new OrderServiceImpl( new MemoryMemberRepository(), new FixDiscountPolicy()); } } 생성자를 통해 외부(AppConfig)에서 구현 객체를 생성하고 연결해준다. MemberServiceImpl의 코드를 보면 인터페이스인 membe..

스프링 2022.02.03

AService에서는 ARepository만 사용하고 BService 사용은 지양하자

처음에 하나의 엔티티 타입을 위한 서비스 클래스를 만들 때 다른 엔티티 타입의 서비스 클래스도 막 가져와서 사용했었다. 이렇게 여러개가 만들어지다 보니 어디에서 썼는지 기억도 잘 안 나고 코드가 너무 지저분해 보였다. 또 단일 책임 원칙도 약간 빗겨간 느낌이 들었다. 초반의 더러운 코드 - 여러 다른 서비스를 주입 받아 사용하고 있다. @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class ProjectService { private final ProjectRepository projectRepository; private final PartService partService; private final UserPartS..

단일 테이블 전략에 의해 자동으로 생성된 칼럼인 dtype을 get하고 싶으면

기술 스택들이 저장되는 Stack 테이블에서 데이터를 모두 가져와야 하는 상황이다. 데이터가 많지 않기 때문에 페이지네이션도 필요없고 정말 한 번에 다 가져와도 문제가 없을 양이다. 단일 테이블 전략에 의해 자동으로 생성된 칼럼인 dtype을 get한다. 그 뒤 프론트엔드 쪽에서 dtype별로 다른 div 아래에 데이터를 그려주기를 원했다. 그러면 쿼리를 한번만 날려서 테이블에 있는 데이터를 전부 한 번에 가져올 수 있기 때문이다. 문제는 이 dtype이 자동으로 생성됐기 때문에 lombok으로 @Getter를 선언해도 getDtype()은 만들어지지 않는다. 그래서 Stack 엔티티에 dtype 필드를 추가해줘봤다. 자동으로 만들어주는 dtype과 중복이기 때문에 충돌이 나 에러를 내주는 것을 볼 수 ..

SOLID 설계 원칙

이 글은 김영한 강사님의 강의와 자료를 학습한 뒤 정리하는 글입니다 객체지향 설계 원칙으로 유명한 SOLID에 대해 알아보자. S - single responsiblity principle : 단일 책임 원칙 O - open / closed principle : 개방 폐쇄 원칙 L - Liskov substituion principle : 리스코프 치환 원칙 I - Interface segregatino principle : 인터페이스 분리 원칙 D - Dependency inversion principle : 의존관계 역전 원칙 설명 참고 코드 MemberRepository m = new MemoryMemberRepository() SRP 한 클래스는 하나의 책임만 가져야 한다 -> 하나의 기능만 수행..

스프링 2022.01.25

객체 지향이란

이 글은 김영한 강사님의 강의와 자료를 학습한 뒤 정리하는 글입니다 객체 지향이란 논리적으로 같은 것들끼리 묶어서 추상화해 객체를 만들고 관리하는 것이다. 캡슐화를 통해 객체의 속성 중 일부를 감출 수도 있다. 보통 캡슐화라고 하면 속성 중 일부를 private으로 선언해서 다른 객체가 접근할 수 없게 하는 것을 의미한다. 또한 논리 단위인 객체 간에 상속도 가능하다. 생물을 상속하는 동물, 식물을 예로 들 수 있다. 이렇게 객체 지향의 특징에는 추상화, 캡슐화, 상속, 다형성이 있다. 이제 다형성에 대해 알아보자. 영어로는 polymophism이라고 한다. 위키백과에서 다형성의 정의를 가져왔다. https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%98%95%EC%84%B1_(%..

스프링 2022.01.25

스프링 부트를 사용하는 이유

이 글은 김영한 강사님의 강의와 자료를 학습한 뒤 정리하는 글입니다 스프링 부트는 스프링과 어떻게 다른지에 대한 정리이다. 스프링 부트는 스프링을 편리하게 쓸 수 있게 해주는 조력자 같은 개념이다. 스프링 부트가 스프링 프로젝트를 쉽게 생성해주고 Tomcat 웹 서버를 내장해주기 때문에 별도로 웹 서버를 설치하고 구성할 필요가 없어진다. 스프링과 외부 라이브러리 구성 또한 자동으로 해주고 빌드 또한 쉬워진다. 스프링 부트 없이 프로젝트를 만들면 초기 설정에 진을 뺴야 할 것이다. 안 쓸 이유가 없다.

스프링 2022.01.25

스프링의 역사

이 글은 김영한 강사님의 강의와 자료를 학습 후 정리한 글임을 알려드립니다. 스프링이 나오기 전 자바 개발자들은 EJB를 사용했다. EJB는 Enterprise Java beans의 약자이다. 하지만 이 EJB는 너무 사용하기 복잡했다. 그렇게 회의감을 느끼던 중 로드 존슨이 순수 자바를 사용해서 만든 지금의 스프링의 기반이 되는 코드들을 책에 적어 발표한다. 많은 자바 개발자들이 이에 관심을 가졌고 스프링이라는 오픈 소스로 발전한다. 스프링(spring)은 정말로 계절 중 하나인 봄이라는 뜻을 가졌다. 자바 진영에 EJB라는 암흑기 같은 겨울이 지나고 봄이 올 거라는 기대감에 붙여진 이름이다. 스프링은 EJB 컨테이너를 대체하는 기술이라면 하이버네이트는 EJB 엔티티빈을 대체하는 기술이다. 하이버네이트..

스프링 2022.01.25

DDL이 무엇인가? 위키백과로 알아보기

DDL은 data definition language의 줄임말이고 데이터 정의 언어이다. 위키백과애 데이터를 정의하는 컴퓨터 언어라고 적혀있다. 이것만 봐서는 무슨 뜻인지 모르겠다. SQL의 데이터 정의 언어의 문장은 관계형 데이터베이스의 구조를 정의한다. DDL 구문에는 CREATE DROP ALTER TRUNCATE 가 있다. 서치 결과는 이러하다. DDL이란 데이터베이스를 만들고 수정, 삭제하는 언어라고 이해하면 되는게 아닌가 싶다. jpa 설정에서 ddl-auto: create이면 기존의 테이블을 drop한 뒤 새로 create한다. ':' 뒤에 있는 ddl을 애플리케이션이 시작될 때 자동으로 해주는 구문이다.

용어 정리 2022.01.22

Entity 설계하기

백엔드에 있어서 데이터베이스의 설계는 중요하다. 효율적으로 설계하기는 쉽지 않지만 김영한 님의 스프링 강의에서 봤던 엔터티 관계를 떠올리며 만들어봤다. draw.io가 제약이 적은 무료 툴이라 사용했는데 left spacing이 작동하지 않는다. 그래서 엔티티의 필드를 볼 때 가독성이 떨어진다. 김영한 님의 spirng 강의에서 category가 트리 구조라 자신과 관계를 맺는 엔티티였다. 그걸 반영하니 대댓글의 엔티티 관계를 만들 수 있었다. Question에 parent와 child를 둬서 parent는 대댓글의 원 댓글을, child는 대댓글들을 값으로 가질 것이다. Stack은 frontend, backend, design 3 분류 나눌 예정이기 때문에 상속 관계를 써야 한다고 생각했다. 굳이 데..

mariaDB sql문 초보가 저지르는 실수 (foreign key)

수업에서 데이베이터베이스 시스템 3판 교재를 사용한다. 교재에 나온 형식이랑 똑같이 mariadb client에 입력했더니 이런 에러가 뜬다. 당황스럽다. 아무리 검색을 해봐도 charset이 잘못됐거나 reference 당하는 테이블에서 primary key로 설정 안 해 놨거나 데이터 타입이 다르다는 말 뿐이다. charset은 건드리지 않았으니 서로 다를 일은 없을 테고 desc 테이블명으로 확인해봐도 primary key로 설정돼있고 데이터 타입도 integer만 썼다. int는 쓰지도 않았다. 원인을 알 수 없어 여러 경우의 수에 대해 테스트 해봤다. 그 결과 해답을 찾을 수 있었다. references에서 attribute 명을 명시해줘야만 한다. 교재가 너무 옛날에 나와서 최신 mariadb..

DB 2021.10.25