하루 2시간
본문 바로가기
728x90
[객체지향 생활체조 원칙] 규칙 6. 모든 엔티티를 작게 유지한다 모든 엔티티를 작게 유지한다. 50줄 이하의 클래스 10개 이하의 파일을 갖는 패키지 단일 책임 원칙과 같은 의미로 엔티티를 작성할 때 하나의 목적을 두고 설계해야 한다. 클래스의 크기를 줄여 분리하면, 하나의 목적을 가진 역할을 하게 된다. 이러한 클래스들을 모아 패키지를 구성하면 된다. 패키지도 클래스처럼 응집력 있고 단일한 목표가 있게 된다. 패키지를 작게 유지함으로써 패키지 자체로 정체성을 지닐 수 있게 된다. 즉, 객체지향 프로그래밍에서는 클래스, 메서드, 패키지든 단일 책임 원칙을 위반하지 않았는지 확인해볼 필요가 있다. 2022. 11. 7.
[객체지향 생활체조 원칙] 규칙 5. 줄여 쓰지 않는다(축약 금지). 줄여 쓰지 않는다. 명명시에 축약을 하지 말자 이번 규칙은 우선적으로 "왜 줄이려고 하는가?" 에대한 질문에서 시작 할 수있다. 메서드의 이름이 긴 이유 중 하나는, 책임을 너무 많이 갖고 있거나, 적절한 클래스의 아래에 위치하지 않아서 일 수 있다. 책임을 너무 많이 가지고 있다면 설계를 다시 고민해야한다. 매소드를 쪼개 단순화 하여야한다. public void example() { User user = new user(); user.updateNameAndAge("새로운이름", 20); } public void example() { User user = new user(); user.updateName("새로운이름"); user.AndAge(20); } 기능을 분리해줌으로써 메서드 이름도 분리해 줄 .. 2022. 11. 7.
[객체지향 생활체조 원칙] 규칙 4. 한 줄에 점을 하나만 찍는다. 한 줄에 점을 하나만 찍는다. 디미터(Demeter)의 법칙 : "친구하고만 대화하라" "자기 소유의 장난감, 자기가 만든 장난감, 그리고 누군가 자기에게 준 장난감하고만 놀 수 있다. 하지만 절대 장난감의 장난감과 놀면 안 된다." 그렇지 않을 경우, 다른 객체에 너무 깊숙이 관여하게 된다. 이는 캡슐화를 어기는 것이다. 즉, 한 객체가 너무 먼 객체를 불러와서 사용하는 것을 지양해야 한다. 코드를 작성할 때 한 라인에 점이 여러 개 생기면 대상 객체의 내부에 깊이 접근할 수 있다는 의미이고, 이는 강한 결합도가 형성되어있다는 것을 뜻하게 된다. 설계에 대한 고민을 해봐야 한다. class Location { public Piece current; } ​ class Piece { public Strin.. 2022. 11. 7.
[객체지향 생활체조 원칙] 규칙 3. 모든 원시 값과 문자열을 포장한다. 모든 원시 값과 문자열을 포장한다. byte, int, long, String, char 과 같은 원시 타입, 문자열 변수를 객체로 포장해 사용하라. 포장한 객체로라면 아주 사소하더라도 컴파일러와 개발자에게 해당 값이 어떤 값이며 왜 쓰는지에 대해 정보를 전달할 수 있다. 이에 따라 단순히 값을 나타내는 것뿐 아니라, 비즈니스적인 의미를 함께 표현해준다. public class SingUp { ​ private static final int MIN_AGE = 19; ​ public void checkUserAge(int age) { ​ if (age < MIN_AGE) { throw new IllegalArgumentException("가입 가능 나이는 " + MIN_AGE + " 살 이상이어야 합니다... 2022. 11. 7.
[객체지향 생활체조 원칙] 규칙 2. else 예약어를 쓰지 않는다. else 예약어를 쓰지 않는다. else 예약어를 사용하지 않고 코드를 작성해보라. switch/case 문을 사용하는 것도 허용하지 않는다. 이번 원칙의 목적은 한 메소드에서 발생하는 분기 문을 줄이자는 것이다. 분기 문을 많이 가지고 있는 메소드는 많은 기능이 있을 확률이 높다. 아래 성적 처리를 보자 public static void getGrade(Int score) { if (score >= 95) { grade = "A+"; } else if (score >= 90) { grade = "A0"; } else if (score >= 85) { grade = "B+"; } else if (score >= 80) { grade = "B0"; } else { grade = "C"; } System.o.. 2022. 11. 6.
[객체지향 생활체조 원칙] 규칙 1. 한 메서드에 오직 한 단계의 들여 쓰기만 한다. 한 메서드에 오직 한 단계의 들여 쓰기만 한다. for 또는 while 반목문 안에 if문이 있으면 들여 쓰기가 두 단계가 된다. 정확히 한 가지 일을 하는 메서드들로 작업을 하면 코드가 달라지기 시작한다. 애플리케이션의 각 단위가 더 작아짐에 따라 재사용의 수준은 기하급수적으로 상승하기 시작한다. 인용 : https://developerfarm.wordpress.com/2012/01/26/object_calisthenics_2/ 아래 구구단을 보자 public static void TimesTable(String[] args) { for (int i = 2; i < 10; i++) { System.out.println(i + "단을 출력 합니다."); for (int j = 1; j < 10; j++).. 2022. 11. 5.
[Spring] API 호출하기-RestTemplate RestTemplate Spring 3.0 부터 지원한 RestTemplate는 Rest 방식 API를 호출할 수 있는 Spring 내장 클래스이다. Spring 5.0 이후 부터는 RestTemplate는 deprecated 되었다. 그래서 WebClient 사용을 지향한다. WebClient 와 RestTemplate 의 차이점은 동기, 비동기 차이이다. RestTemplate 특징 Spring 3.0 부터 지원하는 Spring의 HTTP 통신 템플릿 HTTP 요청 후 JSON, XML, String 과 같은 응답을 받을 수 있는 템플릿 RESTful 형식에 맞추어진 템플릿 Header, Content-Tpye등을 설정하여 외부 API 호출 Blocking I/O 기반의 동기방식을 사용하는 템플릿 S.. 2022. 11. 4.
[회고] 우아한 테크코스 5기 프리코스 1주차 회고 우아한 테크코스 5기 백앤드 프리코스 1주차가 끝이 났다. 기존에 프로젝트들을 진행하면서 놓쳤던 부분이 많았다고 느껴지는 한주였다. 한주간 주로 학습한 내용은 커밋 컨벤션과, 객체지향 생활체조 원칙이다. 커밋 컨벤션 - 유다시티의 커밋 메시지 스타일 프로젝트를 주로 혼자 진행하다 보니 커밋 메시지를 아무 규칙 없이 작성했다. 우테코가 지향하는 문화 중 하나는 유지보수가 용의한 코드이다. 이번에 커밋 컨벤션을 적용하면서 나뿐만 아니라 다른 사람이 git log를 봤을 때 이해하기 쉽게 작성하려고 노력했다. 사실 컨벤션을 적용하면서 놀랐던 건, 전체적인 흐름을 나도 쉽게 이해할 수 있었다. 오류가 났거나 다시 이전으로 되돌아가야 하는 상황이 생기면 git log를 보고 쉽게 돌아갈 수 있었다. 이러한 컨벤션.. 2022. 11. 3.
[Spring] API 호출하기-WebClient Spring WebClient Spring WebClient는 Single Thread와 Non-Blocking방식을 사용한다. Spring Web Client 특징 싱글 스레드 방식을 사용 Non-Blocking 방식을 사용 JSON, XML을 쉽게 응답받는다. React Web 프레임워크인 Spring WebFlux 에서 Http Client로 사용됩니다. Spring Web Client 동작 원리 출처: https://luminousmen.com/post/asynchronous-programming-blocking-and-non-blocking 각 요청은 Event Loop 내에 Job으로 등록이 된다. Event Loop는 각 Job을 제공자에게 요청한 후, 결과를 기다리지 않고 다른 Job을 처.. 2022. 11. 1.
[Spring] kakao login api access token 발급하기 redirect uri 로 코드 값을 받게 된다. 받은 코드값을 //controller @GetMapping(value="/oauth/kakao") public ResponseEntity login(@RequestParam("code") String code) { String access_Token = oAuthService.getKakaoAccesToken(code); ​ return ResponseEntity.ok().body(jwtToken); } //service public String getKakaoAccesToken(String code) { String access_Token = ""; String refresh_Token = ""; String reqURL = "https://kauth... 2022. 10. 28.
[Spring] kakao login api access token 으로 회원 정보 받기 //controller @GetMapping(value="/oauth/kakao") public ResponseEntity login(@RequestParam("code") String code) { String access_Token = oAuthService.getKakaoAccesToken(code); ​ HashMap userInfo = oAuthService.getUserInfo(access_Token); return ResponseEntity.ok().body(userInfo); } //service public HashMap getUserInfo (String access_Token) { ​ // 요청하는 클라이언트마다 가진 정보가 다를 수 있기에 HashMap타입으로 선언 HashMap u.. 2022. 10. 25.
[Spring] kakao login API 전체 프로세스 액세스 토큰을 프론트에서 받아서 백으로 보내는 예도 있는데, 카카오에서 발급받은 액세스 토큰을 바로 사용하는 건 추천하지 않는 방식이다. 출처 : https://devtalk.kakao.com/t/topic/124144/4 로그아웃이나, 연결 해제 요청 시 카카오 액세스 토큰이 필요하다. 그럼 백앤드에서 카카오 액세스 토큰을 저장할지 고민을 해야 한다. 암호화를 한번 걸어서 사용할지, 자체 토큰에 회원 식별 ID만을 보내고 캐시 혹은 DB에 식별 ID와 액세스 토큰을 가지고 있거나 하는 다양한 방법이 있다. Oauth 2.0 을 사용한 로그인이 Kakao만 있는 게 아니기 때문에 주로 사용하는 방법은 자체 토큰을 발급해 사용하는 것 같다. 다시 돌아가 Kakao login API 에서 인증코드를 가지고 .. 2022. 10. 21.
[Algo]-Counting Sort 요약 핵심 아이디어 카운팅 정렬(계수 정렬)은 입력을 반복하고 각 항복이 발생하는 횟수를 새로운 배열에 카운트한다. 카운트한 배열을 사용해 정렬한다. 장점 시간복잡도는 O(n) 으로 엄청난 성능을 보여주는 알고리즘이다. 대표적인 빠른 정렬 알고리즘보다 성능이 좋다. 큌 정렬, 힙 정렬, 합병 정렬 등의 시간복잡도는 O(nlogn) 으로 빠른 성능을 가지고 있다. 단점 입력값의 범위를 미리 알고 있을때만 사용하는게 좋다. 정렬을 하기 위해 새로운 배열을 선언해주어야 한다. 즉, 입력값의 범위가 커지면 메모리 낭비가 된다. ex) 5개의 원소를 정렬하고 하는데, 수의 범위가 0~5000 이라면 새로운 배열의 사이즈는 5000이 된다. 작동 애니메이션 URL https://www.cs.miami.edu/hom.. 2022. 10. 14.
스웨거 헤더 넣기, swagger activate of authorize button api 서버 구현 중에 JWT 토큰 인증 방식으로 구현하면 헤더에 JWT 토큰을 받아서 유효한지 검사하게 된다. swagger 를 활용해 api 문서 작성과 테스트를 하기 위해 swagger 에 헤드에 값을 넣는 방법을 알아보자. build.gradle 설정 implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0' implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '3.0.0' SwaggerConfig 설정 @Configuration @RequiredArgsConstructor public class SwaggerConf.. 2022. 10. 7.
Java - [백준] 1929 소수 구하기 이번 소수 구하기에서 1978 소수 찾기, 2581 소수, 11653 소인수분해 문제와 다른 점은 시간제한이 있다. n 값을 줬을 때 소수를 구하는 방법에는 크게 3가지 방법이 있다. 첫 번째로 모든 자연수, 즉 1~n까지 n 값을 나누어 값이 1, n을 제외한 다른 자연수로 나눠지면 소수가 아니게 된다. for (int i = 2; i < n; i++) { // i의 값 범위를 2 2022. 9. 30.
Java - [백준] 2292 벌집 벌집 모양을 보면 6, 12, 18, 24 ... 6*n씩 증가하는 수열이다. 그리고, 값의 범위도, 직전의 값 + 1 ~ 진전의 값 + (6*n) 이다. 값의 범위안에 있으면, 최단거리는 같은 n값을 가진다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; ​ public class Main { ​ public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); ​ int input = Integer.parseIn.. 2022. 9. 27.
Java - [백준] 1316 그룹 단어 체커 간단하게 설명하면, 입력된 단어를 스펠링단위로 값을 받아 입력된 값을 check[] 에 따로 표시하면서. 다음 스펠링이 check[] 에 표시가 되었다면, 전에 스펠링과 같은 스펠링이면 패스, 다른 스펠링이면 break or return false 로 카운트 하지 않는 방법으로 접근해서 풀었다. 일반 2중 반복문 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; ​ public class Main { public static void main(String[] args) throws IOExceptio.. 2022. 9. 23.
Java - [백준] 1157번 단어공부 입력받을때 영어의 대문자 소문자를 구분하는데 2가지 방법이 있다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import java.util.Set; ​ public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); ​ int[] arr = new int[26]; ​ String s = bf.. 2022. 9. 20.
[git] .gitignore 적용안될 때 git 의 캐시 문제로 캐시 내용을 전부 삭제후 다시 커밋하면 해결된다. git rm -r --cached . ​ git commit -am "fixed "remove git cache" 2022. 9. 16.
[Spring] Could not read JSON/ Cannot construct instance of XXXDto, XXXResponse 에러해결 DTO를 사용해 값을 입출력하는데 에러가 뜬다. 에러 내용은 Cannot construct instance of XXXDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 문제 원인은 DTO를 재구성하는데 생성자가 없기 때문이다. 기존에 DTO는 Builder 로만 객체를 생성했었다. @Getter @Builder public class XXXDto { // ~~~ } 오류를 해결하기 위해 @AllArgsConstructor, @NoArgsConstructor 를 추가해줘야한다. @Getter @Builder @AllArgsCo.. 2022. 9. 13.
Java - [백준] 3052번 나머지 서로 다른 값이 몇개 있는지 출력 = 중복 없는 값 출력 => set 자료형 이용해서 사이즈 구하면 되는 문제 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; ​ public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int a = 0; Set s = new HashSet(); int a.. 2022. 9. 9.
[Spring] Sagger 3.0.0 with Spring boot 2.7.0. 개발 환경 SpringBoot 2.6.1 gradle Swagger 3.0.0 의존성 추가 /* build.gradle */ dependencies { // .. implementation 'io.springfox:springfox-boot-starter:3.0.0' // .. } Seagger 3.x 부터 pringfox-boot-starter 하나로 하위에 필요한 모든 라이브러리가 포함된다. Config 추가 @Configuration public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.OAS_30) .useDefaultResponseMessages(false) .select() .api.. 2022. 9. 6.
Java - [백준] 11021 A+B -7 이 문제에서 IDE를 사용하면 헷갈리는 부분이 생긴다. 예제 입력 1 5 1 1 2 3 3 4 9 8 5 2 예제 입력을 한번에 하고 예제 출력 1 Case #1: 2 Case #2: 5 Case #3: 7 Case #4: 17 Case #5: 7 예제 출력을 한번에 해야하나? 라는 의문이 생긴다. 정답은 아니다. 사람이 예제 입력을 입력하다보면 입력 속도보다 출력속도가 빨라 출력이 보이게 된다. 테스트 코드를 작성해 한번에 입력 값을 넣는 경우 입력 후 출력이 된다. 사실상 속도의 차이일 뿐 그래서 IDE에서 작성하는 경우 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import j.. 2022. 9. 2.
[Java] List, ArrayList 차이 찾아본 결과 간단하게 List = interface ArrayList = class 이렇게 표현할 수 있다. 그럼 차이점은 무엇인가. ArrayList list = new ArrayList (); (O) List list = new ArrayList (); (O) ArrayList list = new List (); (X) 이렇게 보면 대충 느낌이 올것같다. 자바의 두가지 이점을 가지고 있는데 한가지는 다형성이고, 한가지는 유연성이다. 다형성 ArrayList list = new ArrayList (); (O) 벤츠 list = new 벤츠(); List list = new ArrayList (); (O) 자동차 list = new 벤츠(); 위와같이 클래스를 생성 할 때 자동차 타입으로 생성하게 되면 .. 2022. 8. 30.
Java - [백준] 8393번 합 문제 n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오. 이 문제는 2가지 방법으로 풀 수 있다. 반복문을 이용하거나, 수학 공식을 이용하거나 반복문 Scanner sc = new Scanner(System.in); ​ int n2 = sc.nextInt(); int sum = 0; while (n2 > 0) { sum += n2; n2--; } System.out.println(sum); 공식 Scanner sc = new Scanner(System.in); ​ int n = sc.nextInt(); int result = n*(n+1)/2; System.out.println(result); 공식을 사용하면 간단하게 문제가 해결된다. 또한 반복문은 O(n)의 시간 복잡도를 가지고 수학.. 2022. 8. 26.
Java - [백준]2525 오븐 시계 문제에서 중요하게 봐야하는건 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다. 이 부분이다. 예제 1입력 14 30 20 예제 출력 14 50 이런식으로 나오는데 예제 입력의 두번째 줄의 값이 c의 값이다. c의 값은 0~1000 이기 때문에 int c = Integer.parseInt(bf.readLine()); int quotient = c/60; // 입력값을 시간과 int remainder = c%60; // 분으로 나눴다. c값을 60분 기준으로 시간, 분으로 나눠서 저장하고 if (quotient >= 1){ // 몫이 1을 넘을때 -> 입력값이 1시간 보다 클 때 h = h+quotient; // 기존 시간에 입력된 시간 더하기 m= m+rema.. 2022. 8. 23.
java [백준]2884번 알람 시계 //오류 코드 : M>45 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; ​ public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String str = bf.readLine(); StringTokenizer st = new StringTokenizer(str," "); ​ ​ int H = Integer.p.. 2022. 8. 19.
728x90