본문 바로가기

분류 전체보기41

팔로잉/팔로워 구현에서 마주친 동시성 프로젝트를 진행하며 팔로워 수를 증가하거나 줄일때 동시성 문제에 대해 고민했던 내용입니다. 학습과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있습니다. 1. 동시성 문제 현재 팔로우/언팔로우 기능을 구현하는 로직은 아래와 같습니다. 팔로잉/언팔로우을 하게되면 회원 테이블이 가지고 있는 팔로잉 컬럼의 값이 1 증가하거나 감소하는 로직인데요, 이 부분에서 동시성 이슈가 발생했습니다. 여기서 왜 회원 테이블이 팔로잉 카운트를 가지고 있는지에 대해 의문이 생길 수 있습니다. 이는 조회의 편의성을 위해 이렇게 설계했습니다. 한 회원의 몇명의 팔로잉/팔로워 수를 알기 위해 서는 조인으로 데이터를 찾아와 갯수를 세거나 데이터베이스에 직접 카운트 쿼리를 날려야 하는데, 이렇게 매번 조인/카운트 쿼리를 날리는 것은 .. 2022. 9. 19.
도메인 로직이 항상 좋을까? 프로젝트를 하면서 JPA를 활용한 도메인 로직이 항상 좋을까? 에 대해 고민했던 내용인데요 간략하게 정리해보겠습니다. **코드에는 정답이 없다고 생각하기 때문에 하나의 문제 해결 관점이라고 봐주시면 감사하겠습니다. - 도메인 로직(JPA) 으로 좋아요를 구현했을 경우 - 개선 및 도메인 로직이 안좋을때 - Conclusion 1. 좋아요 눌렀는지를 JPA조인으로 가져올 경우 도메인 로직을 활용해 (게시글에) 좋아요를 추가/삭제 하기 위해서는 아래와 같은 로직이 필요합니다. 좋아요를 한 번도 안 눌렀다면 좋아요를 추가하고, 이미 눌렀다면 눌렀던 좋아요가 취소되는 로직입니다. 그런데 여기서 문제가 발생합니다. contains( ) 메서드를 실행하기 위해서는 내부에 어떤 값이 있는지 알아야 하기 때문에 JPA.. 2022. 9. 19.
Auto-Increment와 UUID 좋아요와 이모티콘 기능을 구현하면서 PK에 대해 들었던 의문과 학습/생각정리를 위해 간략하게 글을 남겨봅니다. 1. Auto-Increment와 UUID. 그 의미 Auto-Increment의 경우 데이터가 추가될때 자동으로 PK값이 1 증가하며 UUID의 경우 VARCHAR 혹은 Binary 값으로 PK를 저장할 수 있습니다. Auto-Increment 같은 경우 순차적으로 값이 증가하기 때문에 값이 연속적으로 증가하는 것을 한 눈에 알아볼 수 있는 장점이 있는 반면 중간에 데이터가 유실되거나 하더라도 그 값이 채워지지 않습니다. 반면 UUID의 경우 랜덤한 값이 생성돼서 데이터베이스에 들어오기 때문에 연속적인 값들을 알 수 는 없지만 중간에 공백이 생기더라도 PK의 연속성을 신경쓰지 않아도 됩니다. .. 2022. 9. 13.
[Tip] 리액트에 폰트 추가 리액트 프로젝트에서 사용할 폰트를 추가하는 법에 대해 간략히 정리해보겠습니다. 우선 자신이 사용할 폰트를 선택 후 원하는 스타일을 추가해줍니다. 이후 오른쪽에 link를 복사한 후 리액트 public 폴더의 헤더 부분에 넣어주면 됩니다. 2022. 9. 9.
정규화가 반드시 필요할까? 프로젝트를 진행하며 정규화를 시키지 않고 아래와 같이 테이블을 구성했는데요, 이에 대해 고민했던 사항에 대해 간략하게 공유해보겠습니다. ** 물론 대부분의 상황에서 정규화는 중요하고 필요하지만 이렇게 생각할 수도 있구나 하는 정도로 가볍게 읽어주시면 감사하겠습니다. 1. 현재 상황 및 구현 하루에 실천할 계획을 최대 5개까지 등록할 수 있도록 엔티티(테이블)를 만들고 싶었는데 각 컬럼들을 정규화 시키지 않고 First, Second, Third, Fourth, Fifth로 두고 구현했습니다. 만약 정규화를 한다면 각 컬럼들을 별도의 엔티티로 분리해줘야 합니다. 즉 정규화를 거치면 아래와 같이 하나의 계획에는 각각의 목표들이 일대다로 대응돼야 하며, 테이블이 두 개로 나뉘어지고 데이터를 찾아오기 위해서는 .. 2022. 9. 7.
[Tip] MySQL 비밀번호 정책 낮추기 MySQL에서는 일정수준이상 비밀번호를 요구하는데요, 이 정책을 낮추는 간단한 명령어에 대해 알아보겠습니다. # 비밀번호 수준 LOW로 변경 set global validate_password_policy=LOW; # 비밀번호 수준 보기 show variables like 'validate_password%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password_check_user_name | OFF | | validate_password_dictionary_file | | | validate_pa.. 2022. 9. 2.
[널널한 개발자] 넷플릭스와 같은 서비스를 디자인한다면 널널한 개발자님의 강의를 듣고 작성한 글입니다. 학습 과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있으며 강의 내용이 정말 좋기 때문에 꼭 들어보실 것을 추천드립니다. 1. 어떤 것들을 고려해야할까? 많은 것들을 고려해봐야겠지만 우선 웹 서비스와 스트리밍 서비스를 분리하는 것을 고려할 수 있습니다. 역할과 책임을 분리하는 것인데요, 웹서버는 데이터베이스로부터 정보를 주는 것만 담당하도록 하고 미디어 서버는 송신만을 담당하도록 하는 것입니다. 이 과정에서 유출/노출, DRM을 고려할 수 있는데요, 우리가 핵심적으로 서비스하고 있는 부분이라면 DRM을 고려해 워터마크 등의 저작권을 표시할 수 있습니다. 반면 서비스를 단순 노출시켜야 하는 경우라면 워터마크 보다는 어떻게 하면 서비스를 잘 알릴 수 있을까.. 2022. 8. 30.
[널널한 개발자] 유해사이트 차단원리 널널한 개발자님의 강의를 듣고 작성한 글입니다. 학습 과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있으며 강의 내용이 정말 좋기 때문에 꼭 들어보실 것을 추천드립니다. 유해사이트의 차단원리에 대해 알아보겠습니다. 크게 DNS 질의 응답을 리다이렉트 시키는 방법과 모니터링 두 가지 방식이 있는데요, 먼저 DNS 리다이렉트 방법에 대해 알아보겠습니다. 우리가 웹 브라우저에 요청을 하게되면 PC -> L2 -> 라우터 -> ISP -> DNS 의 순서를 거쳐 데이터가 요청됩니다. 그런데 우리나라는 국가가 ISP를 관리하기 때문에 DNS에 질의를 했을때 응답을 warning.co.kr으로 리다이렉트를 시켜버려 유해사이트를 차단할 수 있습니다. 즉, DNS 서버를 통해 오는 응답을 관리해서 음란사이트를 차단.. 2022. 8. 30.
HTTPS 통신이 이루어지는 원리 프로젝트에서 HTTPS를 적용하기 위해 학습했던 내용에 대해 정리해보려고 합니다. 학습과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있습니다. - HTTPS와 부가개념 - 동작원리 - 결론 / HTTPS를 적용했던 이유 1. HTTPS HTTP는 정보를 텍스트로 주고 받기 때문에 네트워크에서 전송 신호를 가로채는 경우 원하지 않는 데이터 유출이 발생할 수 있습니다. 이러한 보안 취약점을 해결하기 위해 등장한 프로토콜이 HTTPS 입니다. **와이어샤크를 통해 패킷을 복호화시키는 과정에 대해 해당 블로그에서 잘 설명해주셨습니다. HTTPS는 HTTP와 거의 동일하지만 데이터를 주고 받는 과정에 보안 요소가 추가됩니다. HTTPS를 사용하면 서버와 클라이언트 사이의 모든 통신 내용이 암호화되는데, 즉 페.. 2022. 8. 28.
Jacoco 1. JaCoCo Jacoco(Java Code Coverage)는 자바 코드 커버리지를 체크하는데 사용하는 오픈소스 라이브러리 입니다. 테스트를 실행하고 한 퍼센트만큼 커버하지 못한다면 빌드를 못하게끔 막을 수 있습니다. plugins{ id 'jacoco' } jacoco { toolVersion = '0.8.7' } jacocoTestReport { reports { html.enabled true xml.enabled true csv.enabled false // 각 리포트 타입 마다 리포트 저장 경로를 설정할 수 있다. html.destination file("$buildDir/jacocoHtml") xml.destination file("$buildDir/jacoco.xml") } finali.. 2022. 8. 25.
boj-11403 11403번: 경로 찾기 가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오. www.acmicpc.net 문제 가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다. 출력 총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정.. 2022. 8. 25.
[널널한 개발자] 웹 브라우저에 URL을 입력하면 어떤 일이 발생할까? 이는 프로젝트를 하다 해당 강의를 들으며 작성한 글입니다. 학습 과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있으며 강의 내용이 정말 좋기 때문에 꼭 들어보실 것을 추천드립니다. 1. IP주소 찾아오기 우선 도메인 이름이 www.naver.com에 속해있는 IP주소를 알아야 합니다. 따라서 DNS 서버에 질의를 해야 하는데요, DNS는 분산형 DB로(DDNS) 여기서 IP주소를 찾아옵니다. 그런데 그 전에 host 파일을 먼저 찾아보는데요, 여기는 웹 통신에 대한 결과(DNS 결과)를 캐싱하며 만약 이전에 통신했던 기록이 있다면 DNS에 질의를 하지 않습니다. 물론 이는 DS의 설정에 따라 다른데 DC에 따라 공유기에 DNS 포워딩을 해서 전달할 수도 있습니다. 여튼 DNS나 host 파일을 통해 .. 2022. 8. 24.
boj-1916 1916번: 최소비용 구하기 첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 www.acmicpc.net 문제 N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. A번째 도시에서 B번째 도시까지 가는데 드는 최소비용을 출력하여라. 도시의 번호는 1부터 N까지이다. 입력 첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그.. 2022. 8. 24.
boj-2252 2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의 www.acmicpc.net 문제 N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다. 일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오. 입력 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 1.. 2022. 8. 22.
[이펙티브자바] Item 16. 이 글은 인사이트의 EffectiveJava 3rd Edition을 공부하며 작성한 글입니다. 책을 바탕으로 추가적인 내용을 덧붙였습니다. 정리된 내용 이외에도 좋은 내용이 많이 담겨 있기 때문에 꼭 책을 구매해서 공부해 보실 것을 추천드립니다. 이펙티브 자바 Effective Java 3/E - YES24 자바 플랫폼 모범 사례 완벽 가이드 - Java 7, 8, 9 대응자바 6 출시 직후 출간된 『이펙티브 자바 2판』 이후로 자바는 커다란 변화를 겪었다. 그래서 졸트상에 빛나는 이 책도 자바 언어와 라이브 www.yes24.com 1. package-private 아래 그림에서 왼쪽과 같은 클래스는 데이터 필드에 직접 접근할 수 있기 때문에 캡슐화의 이점을 제공하지 못합니다. API를 수정하지 않고는.. 2022. 8. 21.
하나의 레포지토리로 하위 엔티티 관리하기 프로젝트를 진행하며 애그리게잇에 대해 학습하고 고민했던 내용입니다. DDD에 관련된 내용인데 이에 대해 정확한 개념을 학습한 채 작성한 것이 아니기 때문에 잘못된 내용을 알려주신다면 보는 즉시 수정하겠습니다. **JPA를 사용했기 때문에 글을 읽기 위해서는 JPA에 대한 기본적인 이해가 필요합니다. 2022. 10. ** 별도의 API가 필요하기 때문에 하나의 레포지토리로 하위 엔티티를 관리하는 것은 힘들다고 판단해 이 포스팅은 그 당시의 생각, 하나의 방법 정도로 읽어주시면 감사하겠습니다. 1. 별도의 레포지토리가 필요할까? 게시판을 만들때 댓글은 게시글의 하위에 속해있습니다. 이 경우 /api/posts/{postId}/comments/{commentId} 와 같이 API를 구성할 수 있는데요, 물론.. 2022. 7. 31.
값을 검증하는 위치는 어디가 좋을까? 프로젝트를 진행하며 값 검증 위치에 대해 고민했던 내용인데요, DTO에서 @Validation 을 사용해 값을 검증하는 방법을 바꾸고자 했던 내용입니다. 정답은 없기 때문에 하나의 의견으로 읽어주시면 감사하겠습니다. JPA를 사용했기 때문에 글을 읽기 위해서는 JPA에 대한 기본적인 이해가 필요합니다. 1. DTO에서 값 검증 엔티티를 생성하기 위해 값을 DTO에서 검증할 수 있습니다. 이는 아래와 같은데요, 클라이언트로부터 받은 값을 어노테이션을 통해 검증하는 것입니다. 컨트롤러에서 @Valid 어노테이션을 사용해야 하지만 어노테이션을 통해 값을 간편하게 검증할 수 있습니다. 하지만 아래와 같은 몇가지 의문점이 들었습니다. 였습니다. 요구사항이 바뀌면 DTO를 재활용할 수도 없으며 매번 조건을 변경해줘.. 2022. 7. 30.
[Tip] MySQL 패스워드 없이 설치하기 도커를 통해 mysql을 설치하는 과정을 살펴보겠습니다. 아래와 명령어를 입력하면 비밀번호 없이 mysql이 설치되는데요, 물론 처음 mysql을 설치하면 아래와 같이 입력해도 접근할 수 없다는 오류가 뜹니다. 이는 권한을 주지 않았기 때문입니다. # 설치 $ docker container run -d --name {name} -e MYSQL_ALLOW_EMPTY_PASSWORD={password} mysql 이 경우 현재 사용자를 삭제하고 새로운 사용자를 등록, 권한을 부여하면 해결할 수 있는데요, 이에 대한 명령어는 아래와 같습니다. 우선 아래와 같이 use mysql을 통해 사용할 데이터베이스를 선택하고 사용자를 조회해봅니다. 이때 목록 가장 위에 있는 사용자가 내가 최초에 등록한 아이디입니다. #.. 2022. 7. 26.
@Component와 @Configuration의 차이 @Component와 @Comfiguration의 차이에 관해 정리해보겠습니다. 결론부터 말하면 @Component는 개발자가 작성한 클래스를 Bean으로 등록할 때 사용하고 @Configuration + @Bean은 개발자가 직접 제어하기 힘든 클래스를 빈으로 등록할때 사용합니다. **참조 종류 선언 사용 용도 @Component 클래스 사용자가 만든 클래스 @Bean 메서드 외부 라이브러리 1. @Component / @Configuration @Component가 달린 클래스는 자동으로 스프링 컴포넌트 스캔 대상이 되기 때문에 별도로 Bean을 등록하지 않아도 사용할 수 있습니다. 이는 스테레오 타입 어노테이션을 사용하는 클래스에 달려 있는데요, 스테레오 타입이란 우리가 흔히 사용하는 @Contro.. 2022. 7. 24.
boj-1850 1850번: 최대공약수 모든 자리가 1로만 이루어져있는 두 자연수 A와 B가 주어진다. 이때, A와 B의 최대 공약수를 구하는 프로그램을 작성하시오. 예를 들어, A가 111이고, B가 1111인 경우에 A와 B의 최대공약수는 1이고, A www.acmicpc.net 문제 모든 자리가 1로만 이루어져있는 두 자연수 A와 B가 주어진다. 이때, A와 B의 최대 공약수를 구하는 프로그램을 작성하시오. 예를 들어, A가 111이고, B가 1111인 경우에 A와 B의 최대공약수는 1이고, A가 111이고, B가 111111인 경우에는 최대공약수가 111이다. 입력 첫째 줄에 두 자연수 A와 B를 이루는 1의 개수가 주어진다. 입력되는 수는 263보다 작은 자연수이다. 출력 첫째 줄에 A와 B의 최대공약수를 출력.. 2022. 7. 23.
FrontController 패턴 웹 서버 만들기 프로젝트를 진행하며 프론트 컨트롤러 패턴에 대해 학습하고 작성한 글입니다. 학습과정에서 작성했기 때문에 잘못된 내용이 있을 수 있으며, 1. 서블릿과 jsp 서블릿을 사용하면 동적으로 html을 작성할 수 있는데요, 하지만 자바코드로 text/html을 다루기 때문에 메시지 body에 text/html과 인코딩 방식(utf-8)과 같은 정보를 직접 넣어줘야 합니다. 이는 (자바로 html을 다루기 때문에) 복잡하고 비효율적인 방식이며 requestParam( ) 메서드는 반환 타입이 String이기 때문에 형 변환 또한 강제로 해줘야 하는 문제도 있습니다. 이를 극복하기 위해 jsp를 사용하게 됐는데요, 뷰를 생성하는 작업을 jsp가 가져가고 동적으로 변경이 필요한 부분에만 자바 코드를 .. 2022. 7. 21.
[Tip] MySQL 한글 정보 입력 MySQL 5.7 버전에서 INSERT로 테이블에 한글 정보를 입력할 때 아래와 같은 오류가 발생할 수 있습니다. 이는 문자열 인코딩 설정 때문에 발생하는 오류인데요, 간단하게 해결할 수 있습니다. ERROR 1366 (HY000): Incorrect string value: '\xEC\x9D\xB4\xEB\xAF\xB8...' for column 'name' at row 1 크게 두 가지 방법으로 해결할 수 있는데요, mysql.cnf를 통해 데이터베이스 전체의 설정을 바꿔주거나 한 테이블의 인코딩 정보를 수정해주방식이 있습니다. **데이터베이스 전체의 설정을 바꾸게 되면 재실행 시켜주거나 flush로 즉시 반영을 해줘야 합니다. # 데이터 베이스 전체 인코딩 설정을 바꾸는 방법 $ sudo vi /u.. 2022. 7. 20.
boj-1922 네트워크 연결 1922번: 네트워크 연결 이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다. www.acmicpc.net 문제 도현이는 컴퓨터와 컴퓨터를 모두 연결하는 네트워크를 구축하려 한다. 하지만 아쉽게도 허브가 있지 않아 컴퓨터와 컴퓨터를 직접 연결하여야 한다. 그런데 모두가 자료를 공유하기 위해서는 모든 컴퓨터가 연결이 되어 있어야 한다. (a와 b가 연결이 되어 있다는 말은 a에서 b로의 경로가 존재한다는 것을 의미한다. a에서 b를 연결하는 선이 있고, b와 c를 연결하는 선이 있으면 a와 c는 연결이 되어 있다.) 그런데 이왕이면 컴퓨터를 연결하는 비용을 최소로 하여야 컴퓨터를 연결하는 비용 외에 다른 곳에 돈을 더 쓸 수 있을 것이다. 이제 각 컴퓨터를 .. 2022. 7. 19.
@Embedded와 값 객체 @Embedded 를 사용하면 엔티티의 경우 반드시 protected 이상의 기본 생성자를 만들어 줘야 하는데요, 이는 JPA가 리플렉션을 기반으로 동작하기 때문입니다. 하지만 값 객체의 경우 기본 생성자가 없어도 애플리케이션이 동작 하지만 데이터를 추가/수정/삭제할때 예외가 발생합니다. 이에 대해 겪었던 내용을 한 번 정리해보겠습니다. 1. @Embedded와 기본 생성자 값 객체 내부에 기본 생성자를 만들지 않으면 아래와 같이 생성자를 만들라는 경고 메시지가 나타납니다. 물론 이렇게 예외가 발생해도 애플리케이션은 잘 동작합니다. 하지만 실제 값을 저장하는 과정에서는 예외가 발생하는데요, 이를 실험하기 위한 설정을 먼저 살펴보겠습니다. 컨트롤러와 서비스, DTO는 아래와 같습니다. 이제 데이터를 전송해.. 2022. 7. 17.
private 생성자 올바르게 사용하기 프로젝트를 진행하며 private 생성자를 올바르게 사용하기 위해 이펙티브 자바 아이템4를 읽고 추가적인 내용을 보강했습니다. 학습 과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있습니다. - 인스턴스화 방지(feat. 올바른 private 생성자 사용법) - 유틸 클래스와 객체지향 - Conclusion 1. 인스턴스화 방지 모든 클래스들이 인스턴스화가 필요한 것은 아니기 때문에 상황에 따라 private 생성자를 만드는데요, 이를 올바르게 사용하는 방법에 대해 알아보겠습니다. private 생성자를 사용하면 어느정도 인스턴스화를 방지할 수는 있지만 추상 클래스를 만들거나 리플렉션을 통해 인스턴스화를 할 수 있기 때문에 조심해야 합니다. 아래와 같이 추상클래스를 정의하고 유틸 메서드를 만들면 인스턴.. 2022. 7. 17.
boj-1744 수 묶기 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net 풀이 반례 때문에 조금 고생했던 문제인데요, 케이스별로 묶는 것이 핵심인 문제였습니다. 이때 기준을 1로 삼아야 하는데요, 1은 다른 수와 곱하면 자기 자신이 나오기 때문에 무조건 더해주어야 하기 때문입니다. 따라서 1 미만일 경우, 1일 경우, 1초과일 경우로 이를 각각 분류해준 뒤 두 개씩 묶어서 더해주면 됩니다. 이때 개수가 짝수/홀수인 경우도 고려해줘야 하는데, 홀수인 경우 두개씩 묶고나서 마지막 수를 더해주면 됩니다. public class Main .. 2022. 7. 15.
boj-1300 K번째 수 1300번: K번째 수 세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자. 배열 A와 B www.acmicpc.net 풀이 도저히 문제를 이해할 수 없어 다른 분의 풀이를 참조해 풀었던 문제입니다. 전체 풀이 과정은 아래와 같은데요, 핵심 아이디어에 관해서만 간단하게 설명해보겠습니다. 우선 2차원 배열 A는 N X N 형태(N은 10^5 이하)이며, A에 들어갈 값들은 N^2개인데 이 값들이 1차원 배열 B에 오름차순으로 들어있습니다. 이 문제는 순차적인 탐색으로 풀면 시간초과가 나기 때문에 이분탐색을 사용해야 합니다. 구하고자 하는 숫자보다 작은.. 2022. 7. 14.
@Embedded와 기본 생성자 간단하지만 프로젝트를 진행하며 고민하고 삽질(?) 내용에 대해 공유해보려 합니다. JPA를 사용하면 값 객체 내부에 반드시 기본 생성자가 필요한데요, 사용하지 않는 기본 생성자를 어떻게 하면 호출하지 말라고 잘 나타낼 수 있을까? 를 고민했던 내용입니다. **결론은 주석 말고는 없다 였습니다. 1. @Embedded 와 내가 했던 실수 제가 했던 고민과 실수에 대해 내용인데요, JPA에서 @Embedded, @Embeddable을 사용하게 되면 protected 이상의 빈 생성자를 반드시 생성해야 합니다. 이는 엔티티에서 빈 생성자를 반드시 만들어야 하는 것과 비슷한데 경우에 따라서는 사용하지도 않는 생성자를 하나 더 만들게 됩니다. 이렇게 되면 사용하지 않길 원하는 생성자를 잘못 호출할 가능성이 있습니.. 2022. 7. 14.
브릿지 패턴 추상적인 것과 구체적인 것을 분리하여 연결하는 패턴. 하나의 계층 구조일 때보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다. 브릿지 패턴의 장점 - 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다. - 추상적인 코드와 구체적인 코드를 분리할 수 있다. 단점 - 계층 구조가 늘어나 복잡도가 증가할 수 있다. 2022. 7. 10.
싱글톤과 문제점 프로젝트를 진행하며 싱글톤을 학습하게 됐고, 백기선님의 디자인패턴 강의를 듣으며 작성한 글입니다. 학습 과정에서 작성되었기 때문에 잘못된 내용이 있을 수 있으며 이를 알려주신다면 즉시 수정하겠습니다. 1. 싱글톤을 직접 구현했을 때의 문제점 싱글톤을 일반적으로 구현하면 아래와 같은 패턴으로 구현할 수 있습니다. 하지만 여기에는 몇 가지 문제점이 존재하는데요, 우선 동기화 문제에 안전하지 않다는 것과 싱글톤이 깨질 수 있다는 점입니다. 우선 동기화 문제에 대해 살펴보겠습니다. 아래와 같이 코드를 작성했을때 사용자A와 B가 동시에 해당 인스턴스를 생성한다면 모두 new Setting( )을 통해 인스턴스를 생성하게 됩니다. 이 경우 인스턴스가 다른 문제점이 발생하게 되는데요, 따라서 이를 막기 위해서는 아래.. 2022. 7. 10.