하루 2시간
본문 바로가기
728x90
[우테코] 최종 코딩테스트 회고 5시간 매 순간 최선을 다해 잘 싸웠다. 우테코를 고민한다면 꼭 지원해봤으면 한다. 2022년 12월 17일 13시 5기 최종 테스트 시험을 보기 전에 떨리기도 했지만 설레는 감정이 더 컸다. 프리코스 4주간 너무 즐겁게 시간을 보내서 그런지 기분이 좋았다. 처음 문제를 분석하는데 큰 어려움을 느끼진 못했다. 문제 자체가 엄청 어렵다기보다는 세세한 부분이 중요한 문제 같았다. 구현하는 중간에 조금 아쉽게 구현한 부분이 있다고 느껴졌지만, 다시 돌아가서 수정하기엔 시간이 없을 것 같았다. 그리고 시험을 보기 전에 기능 구현 우선이라고 안내받아, 작동되는 쓰레기를 만들기로 다짐하고 그냥 진행했다. 추가로 제공해준 라이브러리가 무작위로 값을 보내주는데, 내가 설계한 순서와 맞지 않아 살짝 당황했다. 내가 생각.. 2022. 12. 19.
[Java] Optional<T> T 타입 객체의 래퍼클래스 - Optional public final class Optional { private final T value; // T타입이 참조변수 // T value는 모든 객체 저장 가능 NULL 포함 } 여기서 NULL 포함한 모든 객체 저장 가능한게 중요한 포인트다. NULL을 직접 다룬다면 NullPonterException 발생할 위험이 크고, 조건문을통해서 NULL을 확인해야 하기 때문에 Optinal 객체를 사용한다. Optinal는 객체기 때문에 주소를 가지고 있고, 그 주소가 가지고 있는 값이 NULL이기 때문에 NullPonterException 발생할 가능성이 없어진다. NULL을 직접 다루지 않기 위해 String, arr 에서는 아래와 같이 사용된다. String.. 2022. 12. 8.
웹소켓 vs SSE(Server-Sent-Event) 차이점 웹소켓 vs SSE(Server-Sent-Event) 차이점 SSE는 전통적인 HTTP를 통해 전송된다. 즉, 작동하려면 특별한 프로토콜이나 서버 구현이 필요하지 않는다. 반면 WebSocket은 프로토콜을 처리하기 위해 전이중 연결과 새로운 웹 소켓 서버가 필요하다. 또한 서버 보낸 이벤트에는 자동 재연결, 이벤트 ID 및 임의 이벤트를 보내는 기능과 같이 WebSocket은 디자인 측면에서 부족한 다양한 기능이 있다. 2022. 12. 6.
[Java] 선언 위치에 따른 변수의 종류 선언 위치에 따른 변수의 종류 public class Class { ​ int iv; // 인스턴스 변수 (Instance Valiable) static int cv; // 클래스 변수(Class Valiable) void method() { int lv; // 지역 변수(Local Valiable) } } 인스턴스 변수 클래스 내에 선언된 변수 인스턴스 변수는 인스턴스가 생성될 때 생성된다. 객체 생성 시마다 새로운 변수가 생성된다. 인스턴스 별로 다른 값을 가질 수 있다. 즉, 각각의 인스턴스 변수마다 고유의 값을 가진다. 클래스 변수 인스턴스 변수에 Static 키워드만 붙여주면 된다. 인스턴수 변수와 다르게 공통된 값을 공유하게 된다. 클래스가 메모리에 올라갈 때 부터 프로그램이 종료될 때까지 유.. 2022. 12. 5.
SSE(Server-Sent Event) SSE(Server-Sent Event) 서버의 데이터를 실시간으로, 지속적으로 Streaming 하는 기술. 웹 표준으로써 IE를 제외한 모든 브라우저에서 지원되며, IE역시 polyfill을 통해 지원이 가능 동작 방식 장점 전통적인 HTTP를 통해 통신하므로 다른 프로토콜이 필요가 없다. 재접속 처리 같은 대부분의 저수준 처리가 자동으로 된다. 표준 기술답게 IE를 제외한 브라우저 대부분을 지원한다. HTML과 JavaScript만으로 구현할 수 있으므로 현재 지원되지 않는 브라우저(IE 포함)도 polyfill을 이용해 크로스 브라우징이 가능하다. (여기서 polyfill이란 브라우저가 지원하지 않는 API를 플러그인이나 JavaScript 등으로 흉내 내 구현한 것을 뜻한다) 단점 IE에선 SS.. 2022. 12. 4.
웹소켓(Web Sockets) 웹소켓(Web Sockets) HTML5 표준 기술로, 사용자의 브라우저와 서버 사이의 동적인 양방향 연결 채널을 구성하고 사용자의 브라우저와 서버 사이의 인터액티브 통신 세션을 설정할 수 있게 하는 고급 기술이다. 개발자는 웹 소켓 API를 통해 서버로 메시지를 보내고 서버의 응답을 위해 서버를 폴링하지 않고도 이벤트 중심 응답을 받는 것이 가능하다. 동작 방식 순서 : 핸드쉐이크 > 데이터를 양방향으로 주고받음 > 웹소켓을 Close 장점 서버와 클라이언트 사이에서 데이터를 주고받을 수 있다. HTTP REST 메서드인 POST보다 빠르다. 여러 API 또는 여러 게임 멀티플레이에도 사용된다. 단점 프로그램 구현에보다 많은 복잡성을 초래한다. 웹 소켓은 HTTP와 달리 Stateful protocol.. 2022. 12. 2.
DB 연동 에러 HikariPool-1 - Exception during pool initialization ERROR 5084 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. 이러한 오류가 나면 application.properties 파일에 spring.jpa.hibernate.ddl-auto = none 이 조건을 추가하면 된다. 이미 만들어진 테이블 생성하는데서 오류가 난듯하다. 2022. 11. 30.
[Java] Stream, 스트림 생성 스트림이란? 스트림은 자바 8에서 추가된 기능으로 함수형 인터페이스인 람다를 활용할 수 있는 기술로 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것이다. 즉, 컬렉션과 배열을 스트림으로 만들면 이후 작업은 통일된다. 스트림의 특징 스트림은 중간연산, 최종연산이 있는데 중간 연산은 0~n번 작업 가능, 최종 연산은 마지막에 0~1번 가능 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다. 스트림은 Iterator처럼 일회용이다. 필요하면 다시 생성해야 한다. 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산 IntStream intStream = new Random().ints(1,46); // 1~45범위의 무한 스트림 intStream.distinct().limit(6.. 2022. 11. 30.
[Java] 람다식 ( Lambda Expression ) 함수와 메서드 차이 함수는 클래스에 독립적, 메서드는 클래스에 종속적 java : oop 언어 + 함수형(fp) 언어 람다식이란 ( Lambda Expression) 함수를 간단한 식으로 표현하는 방법 // function int max (int a, int b) { return a > b ? a: b; } // lambda (a, b) -> a > b ? a : b 람다식 작성하기 메서드 이름과 반환 타입을 제거하고 -> 를 불록 {} 앞에 추가한다. // 익명 함수로 사용 사실은 익명 객체! int max (int a, int b) -> { return a > b ? a: b; } 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능! + 끝에 ; 안 붙인다. 블록{} 안의 문장이 하나뿐 .. 2022. 11. 29.
[AWS] mongoDB ec2 설정 프로젝트 진행중 채팅 기능 구현에 mongoDB를 사용해 채팅 서버를 구현하게되었다. ec2 Amazon Linux 에 MongoDB 설치 방법 ec2 터미널에 들어가 sudo vim /etc/yum.repos.d/mongodb-org-6.0.repo [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/6.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc "I" 눌러서 값 입력후 "esc" 누르고 ":wq" 입력후 엔터, " " 안에 값만 입력. 콘솔창 설치 sudo yum.. 2022. 11. 29.
[JPA] @ElementCollection RDB에는 컬렉션과 같은 형태의 데이터를 컬럼에 저장할 수 없다. 별도의 테이블을 생성해 컬렉션을 관리하게된다. 컬렉션이란 그저 용도가 같거나 유사한 문서들을 그룹으로 묶은 것 JPA 에서 컬렉션 객체임을 지정하는 방법은 @ElementCollection 어노테이션을 사용하는 방법이다. // Member 클래스 @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ElementCollection(fetch = FetchType.LAZY) @Builder.Default Private Set roleSet = new HashSet(); Pu.. 2022. 11. 27.
스프링부트 몽고DB find*() query에러 spring boot with mongodb error //error at com.aks.springStorage.SpringStorageApplication.main(SpringStorageApplication.java:22) [classes/:na] Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "testDB" }' on server localhost:27017; nested exception is com.mongodb.MongoQueryException:.. 2022. 11. 25.
[Java] 예외 처리 프로그램 오류 컴파일 에러(compile-time error) : 컴파일 할 때 발생하는 에러 주로 IDE가 기본적인 오류를 잡아줌 런타임 에러(runtime error) : 실행 할 때 발생하는 에러 에러 (error) : 심각한 오류 ex) out of memmory error 예외 (exception) : 다소 미약한 오류 Exception ... RuntimeException ... 논리적 에러(logical error) : 작성 의도와 다르게 동작 예외처리 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것으로 프로그램의 비정상 종료를 막고 정상적인 실행 상태를 유지하는 위한 것이다. 예외 클래스의 구조 Reference : https://www.benchresources.. 2022. 11. 24.
[Java] @ParameterizedTest 이름 설정, 인텔리제이 오류 @DisplayName("로또 정상 값 테스트") @ParameterizedTest(name = "[{index}] input {0} ") @ValueSource(strings = {"1,2,3,4,5,6", "1,10,20,30,40,45", "40,41,42,43,44,45"}) void lottoNumberTest(String inputString) { Lotto lotto = new Lotto(inputHandler.stringToList(inputString)); assertThat(lotto.getLottoNumbers()).isEqualTo(inputHandler.stringToList(inputString)); } you can customize invocation display names.. 2022. 11. 24.
[Jvav] Map.getOrDefault Map.getOrDefault(Object Key, Integer defaultValue) V getOrDefault(Object Key, Object defaultValue) 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없거나 null이면 기본 값을 반환한다. public static void main(String arg[]) { ​ String [] abc = { "A", "B", "C" ,"C"}; Map map = new HashMap(); ​ for(String key : abc) { map.put(key, map.getOrDefault(key, 0) + 1); } System.out.println("결과 : " + map); // 결과 : {A=1, B=1, C=2} } 2022. 11. 24.
[회고] 우아한 테크코스 5기 프리코스 4주차 회고 객체지향 설계를 할 때 저는 객체를 객체스럽게 사용하는 방법을 잘 알지 못했습니다. 응집도가 높되 결합도가 낮은 설계를 하려면 어떤 기준을 적용해야 하는지 기준이 명확하지 않았습니다. 저는 "객체지향의 사실과 오해"라는 책을 읽고 구글링을 통해 비슷한 문제를 겪은 사람들의 조언을 참고했습니다. 그 결과 저는 "같이 변경되는 코드는 같이, 같이 변경되지 않는 코드는 따로", "객체에 메시지를 보내기"라는 기준을 정했습니다. "같이 변경되는 코드는 같이, 같이 변경되지 않는 코드는 따로." 처음에 BridgeController에서 BridgeGame을 선언할 때 BridgeMap(랜덤으로 만들어진 다리)와 PlayerMap(사용자가 이동하면서 그려지는 다리)를 파라미터값으로 전달해줬습니다. 하지만 Playe.. 2022. 11. 23.
[Java] 일급 컬렉션(First Class Collection)이란? 일급 컬렉션을 간단하게 설명하면 Collection을 Wrapping하면서 그 외의 다른 멤버 변수가 없는 상태를 일급 컬렉션이라고 한다. 원시값 포장과 유사하다. 원시값을 포장하던것을 Collection을 포장하면 된다. public class Users { private List values; public Users(List values) { this.values = values; } } 위 코드가 일급 컬렉션이다. 일급 컬렉션을 사용함으로써 다음과 같은 이점을 가지게 됩니다. 비지니스에 종속적인 자료구조 ( ) Collection의 불변성을 보장 상태와 행위를 한 곳에서 관리 이름이 있는 컬렉션 1. 비지니스에 종속적인 자료구조 원시값 포장에서도 나온 개념으로 객체 자체로 검증로직을 처리할 수 있게.. 2022. 11. 22.
[회고] 우아한 테크코스 5기 프리코스 3주차 회고 든든한 지원군 테스트 코드 객체를 설계하고 테스트 코드를 작성 후 테스트 코드가 정상적으로 작동된다면 리팩토링하는 방식으로 진행했습니다. 정상값, 예외 값에 대해 테스트 코드를 작성해두니 리팩토링하다 실수한 부분을 빠른 피드백을 받을 수 있었습니다. 덕분에 리팩토링을 거침없이 진행할 수 있었습니다. 추가로 도메인 단위로 잘게 나눠주니 테스트 코드를 작성하는 게 크게 힘들지 않았습니다. 처음에 기능들이 한곳에 있으면 이걸 어떤 식으로 테스트 해야 하나 감이 잡히질 않았습니다. 하지만 객체마다 기능을 나누고, 메서드 작게 유지하고, 도메인을 분리하니 정확히 무엇을 테스트 해야 하는지 알 수 있었습니다. MVC 패턴, 도메인 아키텍처, 테스트 코드 등을 지키다 보면 코드는 자연스럽게 객체지향스럽게 작성되는 것.. 2022. 11. 18.
Token 인증 타입, Bearer 이란 무엇인가 토큰 기반 인증을 사용할 때 토큰은 대체로 요청 헤더의 Authorization 필드에 담아져 보내진다. Authorization: type 에 들어가는 값이 Bearer 값이다. 토큰에는 많은 종류가 있고 서버에도 다양한 종류의 토큰을 처리하기 위해 type 값이 다양하다. type 종류 Basic 사용자 아이디와 암호를 Base64로 인코딩한 값을 토큰으로 사용합니다. (RFC 7617) Bearer JWT 혹은 OAuth에 대한 토큰을 사용합니다. (RFC 6750) Digest 서버에서 난수 데이터 문자열을 클라이언트에 보냅니다. 클라이언트는 사용자 정보와 nonce를 포함하는 해시값을 사용하여 응답합니다. (RFC 7616) HOBA 전자 서명 기반 인증방식입니다. (RFC 7486) Mutua.. 2022. 11. 18.
Session vs Token : JWT 사용 이유, 다중 서버 인증 HTTP의 무 상태성과 비 연결성이라는 특징으로 인해 사용자의 인증 정보가 필요할 때마다 인증해야 하는 문제점이 발생한다. 이런 문제를 해결하기 위해 쿠키, 세션, 토큰 등과 같은 곳에 인증 정보를 담아 사용하여 문제를 해결하게 된다. 다중 서버에서는 세션을 이용해 인증 할 수 있지만 세션을 따로 관리해야 하고 복잡하기 때문에 토큰 인증 방식을 주로 사용한다. Session 사용자가 서버에 로그인 요청을 보냅니다. 서버는 로그인 요청을 인증하고, 데이터베이스에 세션을 전송하고, 사용자에게 세션 ID를 포함하는 쿠키를 반환한다. 이제 사용자는 새로운 요청을 (쿠키와 함께) 보냅니다. 서버는 데이터베이스에서 쿠키에서 발견된 ID를 확인하고, ID가 발견되면 요청된 페이지를 사용자에게 보냅니다. 세션의 경우 .. 2022. 11. 15.
[Java]Wrapper Class Wrapper Class Wrapper Class는 기본타입을 객체로 포장하는 역할을 한다. Java의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어진다. 기본타입은 정수, 실수, 논리 타입이 있고, 참조 타입은 클래스, 인터페이스, 배열, 열거 타입이 있다. 실제로 Wrapper Class가 존재하는 것이 아닌, 기본타입의 데이터를 객체로 만들어주는 기능을 하는 클래스를 총칭해서 Wrapper Class라고 부른다. 자바는 모든 기본타입의 값을 갖는 객체를 생성할 수 있다. 이런 객체를 포장 ( Wrapper ) 객체라고 하는데, 기본타입의 값을 내부에 두고 포장하기 때문에 포장 객체이다. 기본타입 값은 외부에서 변경할 수 없다. 기본타입(pr.. 2022. 11. 11.
[회고] 우아한 테크코스 5기 프리코스 2주차 회고 이번 과제를 진행하면서 역시 많은 걸 배울 수 있었습니다. 함수를 최대한 분리하고, 함수별로 테스트하기 위해 노력하였습니다. 또한, 객체지향 생활체조 원칙 9가지도 지키려고 노력하였습니다. 원시 값 포장과 일급 컬렉션 사용자의 Input 값을 주어진 메서드 readLine() 을 사용해 String 값으로 받았고 Computer의 Random 값은 List로 반환하게 하였습니다. 결과적으로 값의 비교는 List로 해야 했습니다. 주어진 입력값은 객체로 포장하여 사용하였는데, 이때 객체로 포장할 때 사용자의 Input 값 String을 List로 변환해서 받을지, String으로 받은 뒤 List로 반환할지 고민을 많이 했습니다. Class 로 값을 묶어서 사용할 때 방법이 아래와 같이 2가지가 있었습니다.. 2022. 11. 9.
[Java] 원시값 포장 Wrapper Class랑 비슷한 개념이다. 하지만 더 큰 범위를 포함한다. 원시값 포장 원시값 포장은 원시유형의 값을 이용해 의미를 나타내지 않고, 의미 있는 객체로 포장한다는 개념이라고 볼 수 있다. 변수를 선언하는 방법에는 두 가지가 있다. int Coin = 20; Coin coin = new coin(20); 포장하는 이유 게임에 사용되는 coin이 있다고 가정하자. coin은 가지고 있을 수 있는 범위가 정해진다거나, 게임을 할때마다 확인한다면. 그때마다 코인의 값이 조건을 만족하는지 확인하려면, 많은 중복된 코드가 작성될 것이다. Coin Class 로 원시값 coin 을 포장하면 문제를 해결할수있게된다. public class Coin { public static final String C.. 2022. 11. 8.
[Git] commit conventions 커밋 메시지의 형식 (): 커밋 메시지의 각 줄은 100자를 넘기지 말아야 한다. 에 들어갈 수 있는 항목들 feat : 새로운 기능 추가 fix : 버그 수정 docs : 문서 관련 style : 스타일 변경 (포매팅 수정, 들여쓰기 추가 등) refactor : 코드 리팩토링 test : 테스트 관련 코드 build : 빌드 관련 파일 수정 ci : CI 설정 파일 수정 perf : 성능 개선 chore : 그 외 자잘한 수정 에 들어갈 수 있는 항목들 어디가 변경되었는지, 변경된 부분은 모두 들어갈 수 있다. 함수가 변경되었으면 함수 이름, 메소드가 추가되었으면 클래스 이름 scope는 생략 가능합니다. 요약 설명 첫글자를 대문자로 쓰지 마세요. 소문자로 쓰세요. 명령문, 현재 시제로 작성합니다. .. 2022. 11. 8.
[객체지향 생활체조 원칙] 규칙 9. getter/setter/프로퍼티를 쓰지 않는다. getter/setter/프로퍼티를 쓰지 않는다. Entity에서 getter/setter 사용을 지양해 상태 노출을 최소화 객체의 상태를 가져오는 접근자를 사용하는 것은 괜찮지만, getter/setter를 사용해 객체 바깥에서 그 결괏값을 사용해 객체에 관한 결정을 내리는 것은 안 된다. 한 객체의 상태에 관한 결정은 어떤 것이든 그 객체 안에서만 이루어져야 한다. 즉, 객체에 메시지를 던져서 작업해야한다. 또한, getter/setter를 사용하게 되면 Open/Closed 원칙을 위반하게 된다. public class Product { ​ private final Name name; private final Count count; ​ public Jamie(Name name, Count count.. 2022. 11. 7.
[객체지향 생활체조 원칙] 규칙 8. 일급 컬렉션을 쓴다. 일급 컬렉션을 쓴다. First Class Collection : Collection을 Wrapping하면서, 그 외 다른 변수가 없는 클래스의 상태를 일급 컬렉션이라 한다. Object나 Array를 Class로 포장한다는 의미 장점 해당 컬렉션에서 필요한 모든 로직은 일급 컬렉션에서 구현. 즉, 비지니스에 종속적인 자료 구조가 만들어진다. 컬렉션을 불변성이 보장된 불변객체로 만들 수 있다. setter을 이용하지 않고 기존 컬렉션 메서드를 이용해 임의로 컬렉션 내용 변경할 수 있다. 상태와 행위를 한곳에서 관리할 수 있다. 응집도를 높이고 결합도를 낮출 수 있다. https://iyk2h.tistory.com/272 [Java] 일급 컬렉션(First Class Collection)이란? 일급 컬렉션.. 2022. 11. 7.
[객체지향 생활체조 원칙] 규칙 7. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. 2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. 이번 규칙은 3번 규칙과 비슷한 의미를 가진다. Class Name { String first; String middle; String last; } Class Name { Surname family; GivenNames given; } Class Surname{ String first; } Class GivenNames{ List names; } GivenNames 클래스에 이름 목록을 만들면, middle, last 또 추가되는 이름값을 받을 수 있게된다. 기존에 3개의 인스턴스를 관리했지만 GivenNames을 만듬으로써 2개의 인스턴스를 관리할 수 있게 되었다. 사실 예제가 이름이라 크게 변화된게 없는데 차로 예를 들면 계층 구조를 가지며 .. 2022. 11. 7.
728x90