[Programmers] 110 옮기기 (Java) - 월간 코드 챌린지 시즌2
·
알고리즘
문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/77886 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 사고 과정해당 문제는 문자열에서 110을 추출하여 다시 삽입하는데 문자열 중 사전 순으로 가장 앞에 오는 문자열이 되도록 삽입해야 한다.사전 순으로 가장 앞에 와야 한다. 가 이 문제의 핵심 요구사항이다. 어떻게 하면 사전 순으로 가장 앞에 오게 만들 수 있을까?일단 추출 과정부터 살펴보자. 주어진 예시 중 하나인 "100111100"에서 110을 추출해보자. 추출 후 문자열은 "100110"이 된다. 즉, 처음의 문자열에서 110을 ..
우당탕탕 서브모듈 도입기
·
대외 활동/SOPT
안녕하세요. 한끼족보 서버 개발자 김가연입니다.저희 한끼족보 서버 팀은 서버를 구축하기 위해 Spring Framework를 사용하고 있는대요, Spring에서는 애플리케이션의 설정 정보를 관리하는 파일이 있습니다. 바로 resoures폴더의 application.yml 파일입니다. DB와 연동하기 위한 비밀번호, 키 값과 외부 API를 이용하기 위한 API Secret 키 등 외부에 그대로 노출되어서는 안되는 기밀 정보들이 application.yml에 포함됩니다. 이러한 중요한 기밀 정보가 만약 Public Git 저장소에 노출되어 악용된다면 어마어마한 서비스 비용이 부과되는 등 매우 위험한 상황으로 이어질 수 있습니다.때문에 만약 Git을 사용하여 협업을 한다면 application.yml 파일은 ..
[BOJ] 행성 터널 (Java) - 플레티넘 5
·
알고리즘
문제 링크https://www.acmicpc.net/problem/2887고민한 점문제에서 N개의 행성과 N-1개의 간선, 모든 행성이 연결되도록, 최소 비용 이 3가지 키워드를 보면 최소 스패닝 트리 (MST) 문제구나! 라는 것이 쉽게 파악 된다.다만, 주어진 N의 최대 범위는 100000 으로, 만약 모든 간선을 구하여 풀고자 한다면, 최대 간선의 개수는 $100000C2$로 시간 초과에 더해 메모리 초과까지 발생할 것이다. 때문에 두 행성 간의 터널 비용을 모두 구하는 단순한 방식으로는 이 문제를 해결할 수 없다.간선의 개수를 줄여보자.크루스칼 알고리즘 플로우를 살펴보면, 간선의 비용이 작은 간선부터 연결하여 연결된 간선의 총 개수가 n-1개가 될때까지 두 노드를 union하는 로직이다. 즉, 간..
[Programmers] 택배 배달과 수거하기 (Java) - 2023 KAKAO BLIND RECRUITMENT
·
알고리즘
문제 링크https://school.programmers.co.kr/learn/courses/30/lessons/150369 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 접근 방법처음 문제를 읽어보면, 복잡하다고 생각할 수 있지만 예시와 상황을 찬찬히 살펴보면 그리디적으로 접근하면 쉽게 해결할 수 있다는 것을 금방 눈치챌 수 있다.최소 거리로 이동하면서 모든 집에 배달 및 수거하기 위해서는, 가장 멀리 떨어진 집에 배달을 하면서 물류창고로 돌아올 때, 멀리 떨어진 집부터 택배 상자를 함께 수거해야 한다. 즉, 가장 거리가 먼 집부터 방문하고 돌아오면서 최대한 멀리 있는 집들의 택배 상자도 함께 수거하..
실전! 스프링 부트와 JPA 활용 2 - 섹션 5~6
·
JPA
컬렉션 조회(OneToMany) 최적화Fetch Join의 한계2개 이상의 컬렉션 fetch join이 불가능하다. 컬렉션 페치 조인은 1개만 사용할 수 있다. 2개 이상의 컬렉션을 fetch join하게 된다면, 카테시안 곱으로 처리하기 때문에 너무 많은 값이 메모리로 들어와 MultipleBagFetchException이 발생하게 된다.컬렉션 fetch join일 경우, 페이징이 불가능하다. 조인 시에 ‘多’ 엔티티의 데이터 개수에 맞추어 데이터가 중복되어 생성되기 때문에 페이징 기준이 틀어져 페이징이 불가능하다. 엄밀히 말하면, 가능하지만 절대 페이징 처리를 해서는 안된다. 컬렉션 페치 조인 시 페이징처리를 하게 되면, 하이버네이트는 경고 로그를 남기면서 모든 데이터를 DB에서 읽어오고 메모리에서 ..
실전! 스프링 부트와 JPA 활용 2 - 섹션 1~4
·
JPA
엔티티를 직접 노출하지 마라@GetMapping("/api/v1/members")public List membersV1() { return memberService.findMembers();}위의 코드처럼 엔티티를 직접적으로 노출하는 것은 많은 문제를 발생시킬 수 있다. 엔티티를 외부에 바로 노출시킬 경우, 엔티티에 변경이 생기면 api의 스펙 자체가 모두 변경이 되고 이는 곧 오류 발생의 원인이 된다. 즉, 화면에 종속적인 api가 만들어지는 것이다. 때문에 엔티티를 바로 노출시키는 것보다는 dto를 활용하여 필요한 것만 노출시켜야 한다.xToOne 관계에서의 성능 최적화순환 참조양방향 연관관계에서 엔티티를 직접 노출하게 되면 순환 참조 문제가 발생할 수 있다. 순환 참조란 무엇일까?순환 참조란,..
실전! 스프링 부트와 JPA 활용1 - 섹션 3~7
·
JPA
애플리케이션 아키텍쳐계층형 구조controller : 웹 계층service : 비즈니스 로직, 트랜잭션 처리repository : JPA를 직접 사용하는 계층, 엔티티 매니저 사용domain : 엔티티가 모여 있는 계층, 모든 계층에서 사용회원 서비스 개발@Service@Transactional(readOnly = true)@RequiredArgsConstructorpublic class MemberService { private final MemberRepository memberRepository; @Transactional public Long join(Member member) { validateDuplicateMember(member); memberRep..
실전! 스프링 부트와 JPA 활용1 - 섹션 1~2
·
JPA
섹션 1@Transactional@Transactional 어노테이션이 test code에 있을 경우, 테스트가 종료되면 자동으로 Rollback을 수행하여 데이터베이스에 데이터가 존재하지 않도록 한다. 반복적인 테스트 수행을 위해 Rollback 하는 것이다. 만약 테스트를 수행하고 DB에 데이터가 담겨있는 것을 확인하고 싶다면 @Rollback(false) 어노테이션 사용하여 Rollback을 취소할 수 있다.Dependency로그창을 보면 쿼리 파라미터는 ?로 찍히고 있다. 이를 실제 값으로 대신 보고 싶다면 아래 의존성을 추가해야한다.implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.6.2'다만, 쿼리 파라미터를 로그로 남기..
자바 ORM 표준 JPA 프로그래밍 - 섹션 10~11
·
JPA
섹션 10, 11. 객체 지향 쿼리 언어JPQL 문법TypeQuery와 QueryTypeQuery는 반환 타입이 명확할 때 사용하는 반면, Query는 반환 타입이 명확하지 않을 때 사용한다.// TypeQueryTypedQuery query = em.createQuery("SELECT m FROM Member m", Member.class);// QueryQuery query = em.createQuery("SELECT m.username, m.age FROM Member m");위의 코드를 살펴보자. 첫 번째 줄의 경우, 반환 타입이 Member임이 자명하다. 때문에 이 경우에는 TypeQuery를 사용해도 된다. 하지만 두 번째의 경우, username은 String 타입이지만 age는 Int 타입..
자바 ORM 표준 JPA 프로그래밍 - 섹션 8~9
·
JPA
섹션 8. 프록시와 연관관계 관리프록시 (Proxy)프록시 객체 (Proxy Object)🍀 프록시 객체는 엔티티의 실제 데이터를 데이터베이스에서 가져오는 시점을 지연시키기 위해 원본(타겟) 객체를 대신해서 호출될 가짜 객체이다.프록시 객체는 실제 클래스(엔티티)를 상속 받아서 만들어지며 클라이언트 코드와 실제 데이터베이스에서 로드된 엔티티 객체(타겟 객체) 사이에 위치한다. 때문에 클라이언트는 실제 엔티티 객체에 직접 접근하지 않고, 프록시 객체를 통해 간접적으로 접근하게 된다. 즉, 프록시 객체는 실제 객체의 참조(target)값을 보관하며 타겟 클래스와 겉모양이 같은 껍데기일 뿐이다. 관계를 쉽게 비유하자면 타겟 객체를 집 주인이라고 생각했을 때, 프록시 객체는 집 주인을 대신해서 계약을 요청받는..