728x90
반응형

전체 글 131

[Spring] 객체 지향 설계의 다섯 가지 기본 원칙 - SOLID

SOLID 다섯 가지 설계 원칙 단일 책임 원칙(SRP: Single Responsibility Principle) 한 클래스는 하나의 책임만 가져야 한다. 책임 영역이 확실해지고, 한 클래스의 변경이 다른 클래스의 영향을 미치지 않습니다. 그리고 책임을 적절하게 분배함으로써 코드의 가독성이 향상되고 유지보수가 용이하다는 장점이 있습니다. 개방-폐쇄 원칙(OCP: Open Close Principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 소프트웨어 구성요소인 컴포넌트, 클래스, 모듈, 함수는 확장에는 열려있고, 변경에는 닫혀있어야 합니다. 이것은 변경을 위한 비용을 줄이고, 확장을 위한 비용은 극대화 해야한다는 의미입니다. 즉 요구사항이 변경되거나 추가사항이 발생하더라도 ..

Spring 2022.07.15

[Spring Boot] Member 서비스 구현 (2)

비밀번호 제약 조건 확인 API [ MemberService.java ] /** * 비밀번호 제약조건 확인 */ public boolean checkPasswordConstraint(String userPW){ Pattern pattern = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d).{8,20}$"); return pattern.matcher(userPW).matches(); } → 이전에 만들었던 비밀번호 제약조건 확인하는 로직(영문 숫자 포함 8~20자리)으로 API 설계 [CheckPasswordConstraintRequest.java] import lombok.Getter; @Getter public class CheckPasswordConstraintReques..

Project/Todo 2022.07.13

[Spring] @ComponentScan @Autowired 의존관계 자동 주입

@ComponentScan @Component 애노테이션이 붙은 클래스를 자동으로 스프링 빈으로 등록합니다. 해당 애노테이션이 붙어있는 클래스부터 하위로 탐색하면서 @ComponentScan의 대상을 찾습니다 그래서 @ComponentScan은 프로젝트가 실행되는 최상단에 두는 것이 좋습니다. 스프링에서는 애플리케이션이 실행되는 {프로젝트이름}Application클래스 @SpringBootApplication을 확인해보겠습니다. @SpringBootApplication 내부에 @ComponentScan이 있는 것을 확인 할 수 있습니다. 애플리케이션이 실행되면서 모든 @ComponentScan의 대상을 찾아서 빈으로 등록하고 @Autowired를 찾아 의존관계도 자동으로 주입해줍니다. @SpringBoo..

Spring 2022.07.12

[Internet] What is Domain Name?

Domain Name 사람들이 원하는 사이트에 방문하기 위해 브라우저에 입력하는 주소를 말합니다. (ex. lakelight.tistory.com) 특정 웹 사이트는 각각의 고유한 도메인 이름을 가지고 있습니다. 도메인 이름을 통해 웹 사이트를 더 찾기 쉽게 하고 식별하기 쉽게 합니다. 식별하고 외우기 어려운 IP 주소 (ex. 127.187.23.13) 를 기억하기 쉬운 단어를 사용해 저장하는 것입니다. Domain Name 구조 도메인 이름은 계층 구조를 갖고 있습니다. 우측에서 부터 Root, Top-Level-Domain(TLD), Second-Leve-Domain(SLD) - SUB 입니다. www는 도메인 네임에 포함이 되지 않습니다. www는 호스트명입니다. Root 가장 최상위에 위치해 있..

Backend/Internet 2022.07.12

[AWS EC2 ubuntu] MySQL 데이터베이스 구축, 스프링 배포 파일 빌드, 서버 데이터베이스를 이용한 Member API 테스트

AWS EC2 MySQL 데이터베이스 생성 이모티콘도 사용할 수 있는 데이터베이스 생성 mysql> CREATE DATABASE TODO_DB CHARACTER SET utf8mb4 collate utf8mb4_general_ci; 전체 데이터베이스 정보 조회 mysql> SELECT * FROM information_schema.schemata s; TODO_DB 데이터베이스의 default character_set_name과 collation_name 조회 mysql> SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA -> WHERE schema_name = "TODO_DB"; Member..

Project/Todo 2022.07.12

[AWS EC2 ubuntu] 서버 초기 설정, MySQL 설정

ubuntu 서버 초기 설정 ● 자바 17 설치 설치 가능한 패키지 리스트를 최신화합니다. sudo apt update && sudo apt upgrade -y PPA 가져오기 sudo add-apt-repository ppa:linuxuprising/java -y APT 저장소 업데이트 sudo apt update APT 패키지 관리자를 사용하여 자바 17 설치 sudo apt-get install oracle-java17-installer oracle-java17-set-default ※ Package Configuration 화면이 나오면 Tab 후 Enter - 자세한 화면과 설명 ※ 설치가 잘 되었는지 자바 버전을 확인합니다. java --version [설치 도중 오류 발생] >>> Sub-p..

Project/Todo 2022.07.12

[Spring] @Configuration과 Singleton By CGLIB

궁금증 MemberService 1번 / TodoService 1번 / MemberRepository 3번 호출 된다고 생각했습니다. 결론적으로 MemberRepository가 3번 호출 되어 싱글톤이 깨질 수도 있다고 생각했습니다. @Configuration public class AppConfig { //차례대로 클래스를 빈에 등록하여 싱글톤을 보장한다고 가정하겠습니다. @Bean //1. MemberService 호출 public MemberService memberService() { //2. MemberRepository 호출 return new MemberServiceImpl(memberRepository()); } @Bean 3. TodoService 호출 public TodoService ..

Spring 2022.07.11

[Spring] Singleton 사용 시 필드 변수 사용 주의❗

개요 싱글톤 방식은 객체 인스턴스를 하나만 생성하여 그 인스턴스를 공유하기 때문에 클라이언트 들이 하나의 인스턴스에 접근을 합니다. 그런데 이때 인스턴스에 있는 필드 변수를 사용하게 되면 문제가 발생할 수 있습니다. 해결방법 싱글톤 방식은 무상태(stateless)로 설계 해야합니다. 1. 클라이언트에게 의존적인 필드가 있으면 안됩니다. 2. 클라이언트가 변경할 수 있는 필드가 있으면 안됩니다. 3. 가급적 필드에 대해 읽기만 가능해야 합니다. 4. 필드 대신 지역변수, 파라미터, ThreadLocal을 사용해야 합니다. 문제점에 대한 예시 필드를 사용하고 클라이언트가 직접 필드의 값을 변경하는 경우 //게임에서 점수를 측정하는 서비스 public class ScoreCheckService { priva..

Spring 2022.07.11

[Spring] AppConfig을 통한 관심사 분리와 리팩터링

1. AppConfig를 통해서 구체 클래스를 선택합니다. 애플리케이션이 어떻게 동작할지에 대해 전체적인 구성을 책임집니다. public class AppConfig { //멤버에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입 public MemberService memberService() { //MemberService 인스턴스를 생성하고 MySQL을 이용한 MemberRepository 객체의 의존성을 주입합니다. //다른 DB를 사용하고 싶다면 Repository 를 새로 생성해서 변경 가능합니다. return new MemberServiceImpl(new MySqlMemberRepository()); } //투두에 대한 서비스를 정의한 인터페이스에 객체 의존 관계 주입 public To..

Spring 2022.07.11

[Internet] DNS and how it works?

DNS (Domain Name System) 인터넷을 이용할 때 사용자가 외우기 어려운 IP주소(ex. 123.223.43.12) 대신 식별하기 쉬운 도메인 이름을 사용할 수 있습니다. 도메인 이름을 사용한다면 도메인 주소를 실제 네트워크 상의 IP 주소로 변환해주어야 합니다. 그 역할을 하는 것이 DNS Domain Name System 입니다. DNS 등장 배경 초기에는 호스트 수가 많지 않아 랜카드를 이용해 hosts.txt 파일을 이용했지만 업데이트가 늦고, 호스트 수가 증가함에 따라 한계에 도달하여 계층 구조, 분산데이터베이스 구조를 가지는 Domain Name System이 나오게 되었습니다. DNS 구성 요소 Domain Name Space Name Server Resolver Domain ..

Backend/Internet 2022.07.11
728x90
반응형