
[git] squash and merge 로 인하여 dev 브랜치를 매 번 새로 파던 이슈
2022. 8. 30. 11:43
카테고리 없음
git 에 대해 잘 모른 채로 어깨너머로 팀원들의 현란한 깃 명령어들만을 구경해 왔다. 이번 프로젝트 때 squash merge 라는 것을 사용하였는데, 이로 인해 예상하지 못했던 상황이 벌어졌었어서 이에 대해 정리 해 본다. 상황 : 우리 프로젝트에서의 브랜치 전략과 merge 전략에 따른 문제점 파이널 프로젝트에서 새로운 브랜치 전략을 도입하며, squash merge 를 적극 활용하기로 했다. 좋은시도였으나 우리모두 다음엔 이렇게 하지 말자..라는 결론이 지어진 방식이 되어버렸다 🥲 하지만 이는 조직마다 선택에 따라 달라질 문제고 이번에 우리가 선택한 방식에서 조금 변경하면 괜찮을수도? 있겠다는 결론을 내렸다. 이는 뒤에서 보자! 우리의 브랜치 전략은 main, develop, feat 브랜치..

선언적 트랜잭션과 programmatic 트랜잭션
2022. 8. 27. 17:33
Spring
Spring 에서는 @Transactional 이라는 어노테이션을 통해 트랜잭션을 쉽게 사용할 수 있다. 스프링에서는 이를 사용하는 방식을 “선언적 트랜잭션을 사용한다" 라고 표현한다. 내부적으로는 AOP 를 사용하여 구현된다. 이미 다들 알겠지만.. AOP 는 “cross-cutting-concern” 즉, 어플리케이션 전반에 걸친 공통적인 관심사 (대표적으로, 커넥션을 가져오고 커넥션을 반환하여 트랜잭션 설정 하는 것 ) 를 비즈니스 로직 으로 부터 분리 시켜 줄 수 있다. 스프링에서 AOP 는 “메소드 레벨 단위로만 적용 가능" 하다는 특징이 있다. 여기서 @Transactional 역시 메소드 레벨로 적용되는 AOP 로 구현되어있다 보니 생기는 문제점은 트랜잭션의 범위를 좁게 유지할 수 없다. 는..
Item 53 : 가변인수는 신중히 사용하라
2022. 8. 24. 13:33
책/effectiveJava
가변인수가 등장하기 전에는? varargs 는 Java 5 에 도입되었다. 그렇다면 그 이전에는 “임의 개수의 인자가 전달되어 올 수 있는 상황" 에 대해 어떻게 다루고 있었을까? 배열을 받는 메소드 → 명시적으로 배열을 인자로 받는 메소드 선언 public int sum(int[] args) { ... } N 개의 메소드를 선언 ( 1개,2개,3개,…. 인자를 받는 메소드들) public int sum() { ... } public int sum(int value) { ... } public int sum(int val1, int val2) { ... } 가변인수? 가변인수 명시한 타입의 인수를 “0개 이상" 받을 수 있다. 가변인수 메소드 호출시 무조건 “배열을 생성" 하여 인수들을 배열에 저장하여 ..
record 의 생성자를 private 으로 만드는 것이 불가능한 이슈
2022. 8. 23. 15:19
Java
상황: record 의 static factory method 만들었다. 개인적인 기호는 new 보다 정적 팩토리 메소드를 사용하는 것을 선호한다. 따라서 타 클래스에서 new 를 통한 생성자를 직접 호출하는 대신, 정적 팩토리 메소드를 사용하도록 제한을 두기 위해 "생성자를 private" 으로 변경하고자 했다. 이미 정적 팩토리 메소드 내부에서는, 모든 불변 필드를 초기화하는 역할의 기본 생성자(이하 '주생성자' 라고 칭하겠음) 를 호출하는 방식을 취하도록 했다. record 타입에서는 컴파일러가 자동으로 public 주생성자를 만들어주기 때문에, 이를 명시적으로 다시 정의해서 private 으로 해주려고 했다. 그런데 컴파일 에러가 발생했다 - 좀 더 구체적인 상황을 적자면 -> 해당 레코드 타입은..
logback.xml 설정할 때 property 들 관련 문제들
2022. 8. 15. 12:56
카테고리 없음
logback.xml 에서 사용될 Property 들을 applicaiton.yml 에 설정해 둘 경우, 인식이 안되는 경우들이 좀 잦은 것 같다. ( logback.xml 이 먼저 실행되어 스프링 부트의 application.yml 설정 파일을 인식하지 못한다는 글들이 있는 것 같은데 logback-spring.xml 로 해도 같은 문제가 발생했었다) 특히 logging.file.path 를 설정해 두었더니 LOG_PATH_IS_UNDEFINED 라는 디렉토리가 프로젝트 하위에 생성되어, 여기에 로그가 생성되는 일이 발생했다. → logback.xml 하위에 로 LOG_PATH 를 등록해주었다. 또한 xml 파일이 원래 tag 의 위치가 중요한지는 모르겠으나, 뒤에, 이 appender 에서 사용할 로..
[Java] method final parameter ?
2022. 7. 27. 10:28
Java
final parameter Method 인자로서 final parameter 를 선언해두는 것을 본 적 있다. Java 에서 final 키워드는 클래스 → 상속을 허용하지 않는 클래스 메소드 → 오버라이딩을 허용하지 않는 메소드 클래스,인스턴스 변수 → 초기화 이후에 값을 변경할 수 없는 변수임을 명시적으로 나타낸다 물론, 이 변수가 “참조변수" 인 경우라면, 해당 객체 내부의 값은 또 변경될 가능성이 존재한다. 를 의미한다. “인자"는 변수와 같은 의미에서 final 을 사용하는 걸까? 어차피 Java 에서는 “참조값을 전달" 하며, 이 값 자체는 스택에 복사되어올 뿐이다. 따라서 새로운 메소드 호출로 인해 생긴 스택 프레임 상의 값을 변경하는 것은 Caller 에 존재하던 참조 변수의 값을 변경하지..
thymeleaf 에서 객체의 메소드 출력하기 그리고 null
2022. 7. 23. 14:45
Spring
기존의 코드는 위와 같았는데,users 에는 Page 타입의 객체가 담겨져 있었다 count 쿼리에 대한 비용이 불필요하다고 생각해(하지만 1,2,3,.. 의 페이지 번호를 보이는 거라면 어쩔 수 없다 or 프론트에서 단 한번만 총 개수를 받아두고 이를 저장해두고 출력해주는 방법도 있을 수도..??) Slice 로 변경하며 Slice users 가 되었고, 위의 코드를 그대로 사용하면 템플릿 파싱 오류가 발생하는 상황이 되었다. 따라서 Slice 객체를 사용하도록 변경해야 했다. 해당 코드는, 이전 페이지가 존재하는지 여부에 따라 Previous 버튼을 비활성화 시키는 코드다. 따라서 Slice 의 hasPrevious() 를 사용해야 했다. 그런데 users 가 null 인 경우도 존재하기 때문에 아래..
[elegant]ch04 ! 끝!
2022. 6. 23. 22:33
책/엘레강트 오브젝트
모든 내용은 정답에 대한 내용이 아닙니다 개인적인 생각들이 추가 되어있으며,책의 내용에 대한 의문도 적어두었습니다 Null 반환 대신 예외던지기 null 반환 메소드 클라이언트에서는 “null 방어 코드" 를 작성해야만 한다. 반환 결과를 확인하는 코드를 작성해야만 한다 → 객체지향세계에서 객체는 “(자신만의 행동, 상태, 생명주기 를 가지는 )자율적인 객체" 이고, 우리는 이 “객체를 신뢰”하며 사용해야 한다. 그런데 객체가 반환하는 결과를 확인해야만 한다면 “신뢰 할 수 없는 객체" 가 되는 것이나 다름없다. 객체는 자신의 행동을 책임져야 한다. 심지어 내부적으로 예외를 발생시키는 것도 괜찮은데, 그 사실에 대해 알려줘야 한다. null 을 반환하는 객체를 신뢰할 수가 없으니 우리는 반환된 결과를 다..