https://product.kyobobook.co.kr/detail/S000001810495

 

도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지 | 최범균 - 교보문고

도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지 | 가장 쉽게 배우는 도메인 주도 설계 입문서!이 책은 도메인 주도 설계(DDD)를 처음 배우는 개발자를 위한 책이다. 실제 업무에 DDD를

product.kyobobook.co.kr

 

 

추천 4.0 / 5

장점 : 예제가 쉬워서 이해가 쉬우며 쉽게 읽힌다.

단점 : 짧다.

 

DDD의 기본적인 개념을 설명한다.

적당한 가독성을 위한 예시가 있어서 책의 진도가 잘 나간다.

책을 읽으며 최근 진행 중이던 프로젝트에 바로바로 적용해 보고 싶은 부분들이 생긴다.

물론 책 한권으로 DDD의 고수가 될 거라는 생각은 안 하지만 무언가 아쉽다.

마지막 한단원을 빼먹고 책을 덮은 건 아닌가 싶어 책 마지막장을 다시 읽어보았다.

 

추천 대상 :

 - 객체 지향 언어에 대해 더 깊게 공부하고 싶은 사람

 - DDD의 기본적인 개념을 익히고 싶은 사람

 - Java MVC 프로젝트의 패키지 주고에 대해 고민하고 있는 사람

 

선행 필수 : Java( 혹은 기타 OOP language 에 대한 지식)

선행 권장 : JPA - JPA에 대한 기초 지식이 있다면 JPA에 대해 조금 더 학습하게 될 수 도

 

 

start.spring.io에서 Jar로 프로젝트를 생성한 이후에 War로 변경하는 방법

 

 

 

위의 이미지처럼 Jar 로 생성했을떄 아래와 같은 build.gradle 이 생성된다.

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.6'
	id 'io.spring.dependency-management' version '1.1.0'
}

... 생략

 

plugins 와 dependencies 에 war 관련 설정을 추가해주자

plugins {
	id 'war'
}


dependencies {
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

 

설정을 변경한 후에 나오는 코끼리 아이콘을 눌러 변경을 적용하면 된다

 

(아이콘이 나오지 않는다면 gradle View 의 [Reload All Gradle Projects] 를 눌러서 적용 가능)

 

 

적용 후의 모습 

정상적으로 적용되면 Gradle view 의  프로젝트명 > Tasks > build 에서 

bootWar, bootWarMainClassName, war 가 추가된걸 확인 할 수 있다.

1. 바로가기 생성

 

ln -s 원본폴더 바로가기명

 

# 예시
ln -s /app/wildfly wildfly바로가기

 

2. 바로가기 삭제 

# 예시 
rm wildfly바로가기

 

바로가기 이름을 입력해야 한다.

rm 입력 후 tab 이용해서 바로가기 이름을 입력하다보면

rm wildfly바로가기/   와 같이 ' / ' 가 추가로 입력되는 문제가 생길 수 있음

'Linux' 카테고리의 다른 글

리눅스 - sudo 다른 계정으로 실행하기  (0) 2022.09.06

이 글은 Java Spring Framework의 JUnit 환경에서 작성되었지만, 다른 프레임워크나 언어에서도 비슷한 상황이 발생할 수 있는 내용을 다루고 있습니다.

 

결론부터 말하면, 

auto increment  되돌리는 방법 

ALTER TABLE table_name AUTO_INCREMENT = 10;

@Transactional에 어떤 옵션을 줘도 자동으로 편하게 되돌릴 수 있는 방법은 없는 듯하다.

때문에 테스트 코드 실행 전 미리 현재의 AUTO_INCREMENT 값을 기록해 두었다가 위의 쿼리문을 통해 되돌려야 한다.

 

하지만,

진짜 결론은 이런 테스트 코드를 작성하지 말자.

 


 

Robert C. Martin의 『 클린 코드』에서 테스트 코드에 대한 몇 가지 FIRST 원칙이라는 개념을 제시한다.

 

F: Fast (빠르게) - 테스트는 빠르게 실행되어야 합니다. 느린 테스트는 개발자가 자주 실행하지 않게 만들고, 효과적인 피드백 메커니즘을 방해합니다.
I: Isolated (독립적으로) - 테스트는 서로 독립적으로 실행되어야 합니다. 테스트 간에 의존성이 있으면 한 테스트가 실패할 때 다른 테스트도 실패할 가능성이 있습니다.
R: Repeatable (반복 가능하게) - 테스트는 언제나 반복 가능해야 합니다. 테스트가 동일한 결과를 보장해야 하며, 외부 환경에 의존하지 않아야 합니다.
S: Self-validating (자체 검증 가능하게) - 테스트는 자체적으로 검증 가능해야 합니다. 테스트 결과는 성공 또는 실패로 나와야 하며, 사람이 수동으로 판단해야 할 결과가 아니어야 합니다.
T: Timely (적시에) - 테스트는 적시에 작성되어야 합니다. 단위 테스트를 작성하는 것이 복잡하고 시간이 많이 소요될수록, 코드에 문제가 발생할 가능성이 높아집니다. 따라서, 개발자는 코드를 작성하면서 즉시 테스트 코드도 작성해야 합니다.

 

이 원칙에 따르면 auto increment를 돌린다는 것은 테스트가 서로 독립적이지 않은 상태이거나 (I 위반) , 반복 가능하지 않은 (R 위반) 테스트일 가능성이 높아 보인다. auto increment에 의존적인 상황이라는 것은 자체 검증하지 않은(S 위반) 테스트 일 가능성 또한 높다고 판단된다.

 

이 글 작성의 원인이 되었던 나의 테스트 코드는 위의 3가지를 정확하게 위반하고 있었다.

 

고로. 테스트 코드에서 단순히 @Transactional을 통해 rollback 시키는 상황에서 auto increment 값이 rollback 되어 있지 않아서 문제가 생기는 부분이 있다면, 테스트 설계, 혹은 테스트 환경이 잘못되어 있는 것은 아닌지 다시 한번 고민해 보자.

 

 

잘못된 내용이나 다른 의견을 리플로 달아주시면 언제든지 감사한 마음으로 피드백 하겠습니다.

감사합니다.😄

'개발 일기' 카테고리의 다른 글

새해 첫날  (0) 2020.01.28

대/소문자 구분하지 않고 자동완성 하기

Settings > Editor > General > Code Completion 

Match case 해제

'Tools > IntelliJ' 카테고리의 다른 글

JUnit 테스트 이름 한글 깨짐  (0) 2023.07.15
IntelliJ 단축키 모음_v1  (0) 2023.04.05

학생이 수강신청을 하는 DB를 예시로 들어보겠다.

 

한 명의 student는 여러 개의 lecture에 들어갈 수 있고 

마찬가지로 하나의 lecture에도 여러 student가 포함될 수 있는 N:N관계의 DB다.

위와 같이 N : N 관계의 테이블 설정에서는 @ManyToMany 를 아래와 같이 설정할 수 있다.

 

@Entity
@Getter @Setter
public class Student {

    @Id
    @Column(name = "student_id")
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(name = "student_lecture"
            ,joinColumns = @JoinColumn(name = "student_id")
            ,inverseJoinColumns = @JoinColumn(name = "lecture_id"))
    private List<Lecture> lectures = new ArrayList<>();
}

 

@Entity
@Getter @Setter
public class Lecture {
    @Id
    @Column(name = "lecture_id")
    private Long id;

    @ManyToMany(mappedBy = "lectures")
    private List<Student> students = new ArrayList<>();
}

 

 

하지만 문제는 실제 테이블을 작성하다보면

student_lecture 테이블에 create_time, update_time 등의 다른 칼럼들이 추가될 일은 많은데

@ManyToMany로 Entity의 변수를 매핑하다 보면 student_lecture 테이블에 다른 column을 추가할 방법이 없다는 것이다.

 

그러한 이유로 아래와 같이 별도의 StudentLecture 클래스를 두고 @OneToMany , @ManyToOne을 사용하여 매핑하는 것을 추천한다.

@Entity
@Getter @Setter
public class Student {

    @Id
    @Column(name = "student_id")
    private Long id;

    private String name;

    @OneToMany(mappedBy = "student")
    private List<StudentLecture> studentLectures = new ArrayList<>();
}
@Entity
@Getter @Setter
public class Lecture {
    @Id
    @Column(name = "lecture_id")
    private Long id;

    @OneToMany(mappedBy = "lecture")
    private List<StudentLecture> studentLectures = new ArrayList<>();
}
@Entity
@Getter @Setter
public class StudentLecture {

    @Id
    @Column(name = "student_lecture_id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "student_id")
    private Student student;

    @ManyToOne
    @JoinColumn(name = "lecture_id")
    private Lecture lecture;
    
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

위와 같이 @ManyToMany 대신 @OneToMany, @ManyToOne 을 사용하고

다대다 관계를 매핑할수 있는 클래스를 사용하면 column을 추가하는 것이 가능해진다.

 

 

틀린 부분은 지적해주시면 언제나 감사히 수정반영 하겠습니다.😄

사람들이 많이 쓰는 단축키 모음도, 제가 개인적으로 많이 쓰는 단축키 모음도 아닌

IntelliJ 에 대해 하나씩 익혀가는 단계에서 하나씩 익숙해지고 있는 단축키 모음일 뿐입니다.

 

Code Template

  IntelliJ Eclipse
System.out.println(); sout sysout
System.out.println("method 명"); soutm -
System.out.println("변수명 = "+변수); soutv -
     
     

단축키 

  IntelliJ Eclipse
Override/Implement Methods Ctrl + O Ctrl + Alt + s  이후 선
Refactor Ctrl + Alt + Shift + T Alt + Shift + T
Refactor - name Shift + F6 Alt + Shift + R
변수 생성(하면서 추출?) Ctrl + Alt + v ?(Alt + Shift + l) 좀 다른데
? Start server? Shift + F10   / Ctrl + F5 뭐가 맞지   
     
Quick Fix Alt + Enter Ctrl + 1
Code Insert Alt + Insert  Alt + Shift + S
Show Project Explorer Alt + 1
(Esc 통해 돌아올 수 있음)
Ctrl + Alt 1 (개인 커스텀)
선언으로 이동/사용처로 이동
구현으로 이
Ctrl + B(선언으로 이동)
Ctrl + Alt + B(구현으로 이동)
F3 (선언으로 이동)
Ctrl +F3 (개인 커스텀 : 구현으로 이동)
라인 위/아래 이동 Alt + Shifft + 위 / Alt + Shift + 아 Alt + 위 / Alt + 아래
라인 아  로 복사붙여넣기  Ctrl + D  Ctrl + Alt + 위 / Ctrl + Alt + 아래
Quick Fix(Create Test Class) Ctrl + Shift + T  Ctrl + 1 후에  create test class 선택(클래스 명위에서 )
향상된 for문 바로 입력하기 (Collection 변수).iter 이후 자동완  

Project Explorer

Show Project Explorer Alt + 1
(Esc 통해 돌아올 수 있음)
Ctrl + Alt 1 (개인 커스텀)
창 크기 조절(좌 우) Ctrl + Alt + Shift + 좌/우 (-)
     
     

'Tools > IntelliJ' 카테고리의 다른 글

JUnit 테스트 이름 한글 깨짐  (0) 2023.07.15
인텔리제이 대소문자 구분 없이 자동완성  (0) 2023.04.18

IntelliJ 를 쓰면서 유용하다 싶었던 기능들 하나하나를 최대한 이클립스에 비슷하게 넣어보고자 한다.

 

Eclipse sysout vs IntelliJ sout

 

이클립스에서 기본으로 제공하는 템플릿 중에 sysout 입력후 자동완성을 하면 System.out.println(); 이 자동완성된다.

IntelliJ 에서는 이와 유사하게 sout 을 입력하면 System.out.println(); 이 나온다.

 

IntelliJ soutp soutv soutm

IntelliJ 는 여기에 더불어 soutp, soutv, soutm 템플릿을 제공하는데 

soutm 은 함수명

soutp 는 parameter 명들

soutv 는 변수 명을 선택할수 있게끔 하여 템플릿을 제공한다.

 

soutm , soutp
soutv

 

Eclipse  에서 soutp 

안타깝게도 이클립스에서 soutp , soutm, soutv  와 같은 템플릿은 기본으로 제공하지 않기에 열심히 구글링해본 결과를 바탕으로 그나마 유사한 방법을 구현해 보았다.

 

 

Windows > Preferences > Java > Editor > Template 

New 클릭하여 아래와 같이 입력 해주면 끝

 

Editor창에서 soutp 입력후 자동완성하면 아래와 같은 코드 자동생성

private static void test(int ddd, String abbb) {
	String[] lArgsNames = "ddd, abbb".split(", ");
	Object[] lArgsValues = new Object[] { ddd, abbb };
	for (int i = 0; i < lArgsValues.length; i++) {
		logger.info("{} = {}", lArgsNames[i], lArgsValues[i]);
	}
	
}

결과물 

int1 = 5
str1 = ddd

 

 

logger 이용한 버전

String[] lArgsNames = "${enclosing_method_arguments}".split(", ");
Object[] lArgsValues = new Object[] {${enclosing_method_arguments}};
for (int i = 0; i < lArgsValues.length; i++) {
	logger.info("{} = {}",lArgsNames[i], lArgsValues[i]);
}

System.out.print 이용한 버전 

String[] lArgsNames = "${enclosing_method_arguments}".split(", ");
Object[] lArgsValues = new Object[] {${enclosing_method_arguments}};
for (int i = 0; i < lArgsValues.length; i++) {
	System.out.println(lArgsNames[i] + " = " +  lArgsValues[i]);
}

 

'Tools > Eclipse' 카테고리의 다른 글

Eclipse 단축키 정리 20221215  (0) 2022.12.15
Resource out of sync with file system  (0) 2019.11.15

+ Recent posts