본문 바로가기
관리자

Programming-[Backend]

(417)
[스프링 기초] 7. IoC, DI, 컨테이너 1. IoC(Inversion of Control) : 제어의 역전 이전 글에서 사용영역과 구성 영역을 구분함으로써 객체 지향 설계 원칙을 지킬 수 있었다. 구성 정보를 설정하는 AppConfig 클래스를 만들어서 객체를 생성하고, 할당하였다. 이전글 : 6. 사용영역과 구성영역 나누기로 SRP, OCP, DIP 원칙 실현하기 IoC는 용어의 이름에서 알 수 있듯, 구성 정보를 내가(실행 코드가 있는 객체가) 직접 설정하는 것이 아니라, 외부(라이브러리, 프레임워크 등)에서 이런 과정을 대신해주는 것을 의미한다. -> AppConfig.class 파일에서 구성 정보를 설정해주는 것도 IoC라고 할 수 있다. 2. DI(Dependency Injection) DI는 직역하면 '의존 관계 주입' 이지만, 좀..
[TIL] MSSQL 날짜값 지정, CONVERT, DATEPART(DATE_FORMAT), GROUP BY alias 1. SQL 구문 날짜값이 포함된 MSSQL 쿼리문을 작성한다. 1 2 3 4 5 6 7 SELECT A1, CONVERT(varchar(10), a.updated_at, 20) AS date, CONVERT(varchar(10), DATEPART(dw, a.updated_at)) AS dayOfWeek FROM absolute AS a JOIN .... ON .... WHERE ..... GROUP BY CONVERT(varchar(10), a.updated_at, 20), DATEPART(dw, a.updated_at) ORDER BY CONVERT(varchar(10), a.updated_at, 20); Colored by Color Scripter cs 2. CONVERT(포맷(길이), 날짜값, ..
[TIL] SQL ANY_VALUE 가끔 SQL 구문 중 ANY_VALUE 구문이 나올 때가 있다. 다음 구문에서, customer.name 을 any_value로 지정하게 되면 customer.id를 통해 group by 가 이루어지면서 orders.value는 customer.id값이 같은 값끼리 더해지게 된다. 그러나 customer.name값은 이름에서 알 수 있듯이 이름 값이라서 sum 등의 합산(aggregate) 구문으로 치환될 수 없다. 이럴 때, any_value를 써주면 여러 행의 customer.name값 중 아무거나 1개의 값으로 대표되어 표기된다. 1 2 3 4 select customer.id , any_value(customer.name) , sum(orders.value) from customer join or..
[TIL] @SuperBuilder 사용법 1.개요 @Builder처럼 어떤 객체의 필드값들을 편하게 지정하기 위해서 사용한다. 다만, super라는 말에서처럼 부모 객체를 상속받는 자식 객체를 만들 때, 부모 객체의 필드값도 지정할 수 있게 하기 위해서 사용한다. 2. 사용법 테스트를 위해서 ListDto라는 객체를 빌더 패턴을 이용해서 만들고자 한다. 이 객체에 companyId 라는 필드값을 1L로 지정할려고 한다. 그런데, 아래와 같이 companyId는 ListDto가 상속받고 있는 BaseDtoAbstract의 필드라면, 부모 객체인 BaseDtoAbstract와 자식 객체인 ListDto에 @SuperBuilder 어노테이션을 적어줘야한다. 그러면 처음 그림과 같이 자식 객체에서도 부모 객체의 필드값을 빌더 패턴으로 만들어줄 수 있게..
[스프링 기초] 6. 사용영역과 구성영역 나누기로 SRP, OCP, DIP 원칙 실현하기 1. 변경 코드 적용 : RateCaringPolicy 동물원의 정책이 바뀌어서, FixedCaringPolicy에서 RateCaringPolicy로 변경됬다. 다행히도 다형성을 지켜가면서 인터페이스로 역할을 만들어놨기 때문에, 기존 인터페이스를 상속받는 새로운 클래스를 만들기가 수월하다. RateCaringPolicy CaringPolicy 역할(interface)을 그대로 상속받기 때문에 작성해놓았던 totalExpense 메서드를 그대로 활용할 수 있다. 2. SRP, OCP, DIP 위반 그런데, 바뀐 RateCaringPolicy를 적용하기 위해서 클라이언트와 소통하는 Service 코드를 살펴보면 OCP, DIP 그리고 SRP가 위반되어 있는 것을 알 수 있다. 아래 코드를 보면서 뭐가 잘못된..
[스프링 기초] 5. 예제만들기2 : SRP 원칙 및 객체 주입, 의존에 대한 이해 1. 예제 확장 위 그림과 같이 예제를 확장해보자. Plan(Creature, CaringPrice, Policy) 관리 계획에서는 Plan이라는 객체가 있고, Plan은 생물(creature)의 종류, 생물 종류에 따른 Caring Price, 관리 정책 Policy에 의해 제어된다. Service, 로직을 구현하는 위치 클라이언트로부터 받은 파라미터 값을 검증(validation)하거나, 계산하는 등 input값을 바탕으로 적절한 output을 만들어 내는 곳이다. Creature, 관리 대상인 생물들 생물들은 각기 무게(weight)가 있고, 무게에 비례하게 관리 비용(expense)이 든다고 가정한다. 또한 동물이든 식물이든 멸종위기 종의 기준인 Grade가 있어서, 일반 종은 Normal, 멸종..
[링크] 자바 final 요약 참조1. 링크 요약 -final은 클래스, 메서드, 변수에 붙일 수 있다. -final로 선언하면 해당 객체가 변하더라도 원래 선언 시에 할당되었던 값으로만 객체를 참조한다. -final이 붙은 클래스는 상속 불가 -final이 붙은 메서드는 오버라이드 불가 -final이 붙은 변수는 재할당 불가 참조 1. 개발왕 도던님의 블로그 https://makemethink.tistory.com/184
[TIL] [패턴] 회원 활성화/비활성화, 수정 비즈니스 로직 구현 1. 구현 대상 회원 또는 활성화/비활성화 및 수정 비즈니스 로직이 필요한 경우. 예를 들어 아래와 같은 엔티티가 있다고 가정한다. 2. 구현 방식 2-1. Controller 수정을 목적으로 하므로, @PutMapping 처리를 해준다. 프론트 쪽에서 "v1/member" 주소로 MemberChangePo를 Http의 Body로 던져주고, Service에서 changeMemberInfo 메소드를 실행한다. 2-2. Service 여기가 패턴의 핵심이다. DB에서 어떤 객체의 Id값이 0일수 없으므로, id가 0일 때는 새로운 객체를 생성하도록 한다. -> 210604 수정 : id == 0 으로 하되, null 일때의 방어 로직이 있어야 한다. 생성된 엔티티의 필드값들을 Po로 입력받은 값들로 정의하고..