개발이 좋아서/Spring이 좋아서

    싱글톤 패턴, 싱글톤 컨테이너(스프링 컨테이너)

    싱글톤 패턴public class SingletonService { private static final SingletonService instance = new SingletonService(); public static SingletonService getInstance() { return instance; } private SingletonService() { } public void logic() { System.out.println("싱글톤 객체 로직 호출"); }}- private 생성자를 만들어 new 를 하지 못하게 막는다. public class SingletonTest { @Test @DisplayName("스프링..

    스프링 빈 등록/조회 - XML 사용

    xml bean 등록   bean 조회public class XmlAppContext { @Test void xmlAppContext() { GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); MemberService memberService = ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberService.class); }}

    스프링 빈 등록/조회

    config Bean 등록@Configurationpublic class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); ..

    DI (Dependency Injection) / IoC (Inversion of Control) 예제로 알아보자

    public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); }}- MemberServiceImpl은 지금 MemberRepository(추상) 뿐만 아니..

    좋은 객체 지향 설계의 5가지 원칙 (SOLID)

    SRP: 단일 책임 원칙(single responsibility principle)한 클래스는 하나의 책임만 가져야 한다.하나의 책임이라는 것은 모호하다.중요한 기준은 변경이다. 변경이 있을 때 파급효과가 적으면 단일 책임 원칙을 잘 따른 것 OCP: 개방-폐쇄 원칙(open/closed principle)소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다.다형성을 활용해보자인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다. LSP: 리스코프 치환 원칙(liskov substitution principle)프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다...

    [Backend] - 로그인 및 회원가입(api)

    1) LoginApi package clonestudy.clonestudy.login.api; import clonestudy.clonestudy.exception.ShjException; import clonestudy.clonestudy.login.model.LoginLog; import clonestudy.clonestudy.login.service.JwtService; import clonestudy.clonestudy.login.service.LoginService; import clonestudy.clonestudy.login.vo.LoginLogVO; import clonestudy.clonestudy.login.vo.LoginVO; import clonestudy.clonestudy.sha..

    [Backend] - 로그인 및 회원가입(회원가입_dto, model, vo)

    1) dto MemberInfoDTO package clonestudy.clonestudy.member.dto; import lombok.Builder; import lombok.Data; import java.time.LocalDateTime; @Data @Builder public class MemberInfoDTO { private int id; private String name; private String email; private String phoneNum; private String nickname; private boolean sex; //0: 남성, 1: 여성 private String birthdate; private LocalDateTime regDate; private int lo..

    [Backend] - 로그인 및 회원가입(회원가입_service, repository)

    1) service MemberService package clonestudy.clonestudy.member.service; import clonestudy.clonestudy.exception.ShjException; import clonestudy.clonestudy.member.dto.MemberInfoDTO; import clonestudy.clonestudy.member.model.Member; import clonestudy.clonestudy.member.repository.MemberRepository; import clonestudy.clonestudy.member.vo.MemberRegVO; import clonestudy.clonestudy.share.ResponseEnum; imp..

    [Backend] - 로그인 및 회원가입(로그인_dto, model, vo)

    1) dto SignInRes package clonestudy.clonestudy.login.dto; import lombok.Data; @Data public class SignInRes { private int id; private String name; private String accesstoken; private String refreshtoken; private String decodetoken; } ValidateJwt package clonestudy.clonestudy.login.dto; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lom..

    [Backend] - 로그인 및 회원가입(로그인_service, repository)

    1) service AuthService package clonestudy.clonestudy.login.service; import clonestudy.clonestudy.exception.ShjException; import clonestudy.clonestudy.login.dto.SignInRes; import clonestudy.clonestudy.login.model.AccessToken; import clonestudy.clonestudy.login.repository.TokenRepository; import clonestudy.clonestudy.member.model.Member; import clonestudy.clonestudy.share.LocalDateUtils; import or..