spring boot 25

spring boot에서 커맨드 패턴

커맨드 패턴이란? 커멘드 패턴은 여러 객체들에 명령(Command)을 해야 할 때 사용되는 패턴입니다. 커맨드 패턴 간단한 원리 command가 만들어지면 createBraodcast란 커맨드로 antmedia, broadcast 등에 메서드 하나로 조작할 수 있습니다. 커맨드 패턴 사용한 이유 스트리밍 서버를 antmedia와 broadband 두가지를 사용하고 있습니다. 방송 시작할 때 antmedia와 broadband 로직의 차이가 있습니다. antmedia - 방송 할때마다 새로운 송출 주소를 생성함 broadband - 이미 생성되어 있는 송출 주소로 매번 방송을 시작함 그래서 방송 시작 로직에 방송 시작 커맨드 실행하면 각각의 로직을 실행하게 끔 했습니다. 커맨드 패턴 적용 Map으로 각 스..

Spring boot에 Facade 패턴 적용

Facade란? "건물의 정면"을 의미로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미 class TV() { var channel: Int = 0 set(value) { field = value println("Channel is set to $value") } var volume: Int = 0 set(value) { field = value println("Volume is set to $value") } } class Remote() { fun on(tv: TV) { println("TV is on") } fun off(tv: TV) { println("TV is off") } fun setChannel(tv: TV, channel: Int)..

Spring boot에 전략패턴 적용

전략 패턴의 배경 예시 입니다 :) 인프런에 비즈니스 로그인(Account)이 있고 일반 로그인(User)이 있다. public interface Login { public void login(); } public class User implements Login { public void login() { System.out.println("일반 유저가 로그인 한다.") } } public class Account implements Login { public void login() { System.out.println("비즈니스 유저가 로그인 한다.") } } 예시 만들기 어렵네..(좀 어거지임) 근데 여기서 login 메서드를 ‘일반 유저가 또 로그인을 한다.’ 라고 하고 싶을 경우 메서드를 직접 바..

webClient 와 feignClient

Deprecated 된 rest template를 대체하는 HTTP 클라이언트 블로그에 쓰는 글들은 여기에 있습니다.(정리가 좀 필요할 것 같지만) https://github.com/YuSunjo/spring-boot-example feignClient interface를 작성하고 기존의 spring boot 처럼 사용해서 복잡도가 낮고 은근 친숙함 netflix에서 만들어졌다고 하네요. 요즘 MSA에서 많이 사용한다고 합니다. (제대로 해보지 않아서 ㅠ) import dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:2021.0.0" } } dependencies { ... // fe..

jpa comment를 custom annotation으로 만들기

배경 보통 jpa를 할 때 comment를 달기 위해서는 @Column(columnDefinition = ...) 이렇게 해야한다. @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(columnDefinition = "varchar(10) not null comment '이름'") private String name; private String description; } 코드에 주석처리로 처리 할 수 있겠지만 DB에 설명이 있기 위해서는 코멘트를 적어야한다. (혼자 개발하는게 아니니까?) 아 근데 매번 저렇게 추가하는거 귀찮은데? 어노테이션으로 comment..

stub, mock, spy 비교

배경 솔직히 테스트 코드를 짜오면서 정확한 차이들을 모르고 있었다는 생각이 들어서 정리를 해보려고 합니다. 원문 https://martinfowler.com/articles/mocksArentStubs.html Mocks Aren't Stubs Explaining the difference between Mock Objects and Stubs (together with other forms of Test Double). Also the difference between classical and mockist styles of unit testing. martinfowler.com test double Meszaros는 테스트 목적으로 실제 개체 대신 사용되는 모든 종류의 가상 개체에 대한 일반 용어로 ..

converter를 만들지 않고 jpa mysql에서 json 사용하기

배경 컬럼에 json을 넣을일이 많지는 않지만 가끔 생길수도 있다. 근데 jpa에서 쓰려면 Jacson + 직렬화가 필요하다. 제네릭 converter를 사용해서 직렬화 / 역직렬화 하는 converter을 사용해도 되지만 더 간단한 방법이 있다. 일단 이거를 추가해줍니다. // json -> jpa implementation("com.vladmihalcea:hibernate-types-52:2.16.2") 엔티티 @Entity @AllArgsConstructor @NoArgsConstructor @Builder @Getter @TypeDef(name = "json", typeClass = JsonType.class). -> 이거를 추가해주고 public class Member extends BaseEn..

fetchJoin과 pagination을 같이 사용할 때

배경 페이징을 하려고 하는데 fetchJoin하고 같이 사용할 경우 정확히 말하면 fetchJoin하고 limit을 같이 사용할 경우 firstResult/maxResults specified with collection fetch; applying in memory 이러한 오류는 아니지만 경고 메세지를 보게 됩니다. - 즉 실행도 되고 데이터 양이 적을 때는 모르지만 나중에 문제 발생 저도 데이터를 가지고 테스트 할 때는 경고를 못보고 넘어갔는데 테스트 코드를 짜면서 계속 실패해서 찾게 되었습니다. (테스트 코드의 중요성) 문제 1개의 board에 여러개의 hashTag가 있음 이전에 작성한 코드 override fun findBySearchingPagination( pageable: Pageable,..

MultipleBagFetchException 발생시 - fetchJoin 여러개 썼을 때

JPA에서 N + 1 문제를 해결하려고 fetchJoin 을 사용하게 됩니다. 이 때 하나의 entity에서 1:N이 여러개 일때 fetchJoin을 여러번 사용했는데 MultipleBagFetchException이 발생하게 됩니다. 즉, 2개 이상의 OneToMany 자식 테이블에 Fetch Join을 선언했을때 발생 OneToOne, ManyToOne과 같이 단일 관계의 자식 테이블에는 Fetch Join을 써도 됩니다 @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class Record extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENT..

@Transactional의 정의, 같은 클래스에서 호출, 예외처리

트랜잭션이 무엇인가? 그리고 특징은? @Transaction을 같은 클래스에서 호출할 경우? @Transaction이 CheckedException, UnCheckedException에서 어떻게 동작하는지? 트랜잭션이란 무엇인가? 트랜잭션이란 데이터 베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미 상태변경 - insert, update, select, delete 트랜잭션의 특징(ACID) 원자성(Atomicity) 트랜잭션이 데이터베이스에 모두 반영되던가 전혀 반영이 되지 않아야한다. 일관성(Consistency) 트랜잭션 처리 결과가 항상 일관성 있어야한다. 독립성(Isolation) 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 다른 트랜잭션의 연산에 끼어들 수 없다. 지..