백준 2468번 안전 영역 문제를 풀어서 바킹독 알고리즘 강의 풀이 레포지토리에 PR했다. 

이번에 올리는 PR이 3번째라... 제발 merge되기를 빌었는데. 드디어 되서 기뻤다.

어젯밤에 반례를 못찾고 왜 틀렸는지 못찾아서 2시간이나 잡아먹은 문제라... 

그리고 앞으로 변수명은 i,j로 꼭 맞춰야겠다. 

 

유툽 강의 댓글에 이 문제에 대해 질문하고 내 코드를 달아놨는데.

우연히 바킹독님 유튜브 라이브때 접속해계셔서. 밤에 라이브때 내 코드를 띄워놓고(좀 부끄러웠지만..) 바로 반례찾아주셨다. 

감동이었고 감사했다. 

나도 바킹독님 처럼 다른사람을 도울 수 있는 능력과 마음을 가진 사람으로 성장하고 싶다는 생각을 다시금 했다. 

 

728x90

 

바킹독님 알고리즘 문제 풀이 레포지토리에 내 코드를 PR 올렸다. (두근두근)

다른 분 레포에 PR을 올려본건.. 처음인데. 

 

바킹독님으로부터 코드 리뷰를 받았다. 레포지토리의 컨벤션 지키는 것에 실수가 있고 파일명이 꼬여서라는 이유로 Close 됬지만.

덕분에 short-circuit evaluation을 다시 상기시키며 내 코드가 어떻게 나아질 수 있는지 배울 수 있어서 기뻤다. 

 

동작은 하는데, 찜찜하고 어떻게 더 낫게 고치는지 방법을 못찾겠는 상태였었는데.

이제 속시원.

 

바킹독님이 컨벤션을 고쳐주시고 (Tab -> space2개.. etc) 코드의 아쉬운점을 고쳐서 새로 올려주셨다.  

Authored by 내 닉네임이 올라가니까 설레기도 하고. 더 잘하고 싶다는 마음과 재미도 생겼다. 

앞으로도 화이팅.

728x90

C++ 로 알고리즘 문제풀기에 필요한 내용이어서 메모해둔다. 

 

백준에서 문제풀때 bits/stdc++.h 만 추가하면 되니까 유용하다.

다른 온라인 저지 사이트에서는 사용 안되는 곳이 있으니깐 유의하자.  

 

stdc++.h는 c++ 대부분의 헤더파일명을 다 갖고 있다. 그래서 따로 #include "vector" 해 줄 필요가 없다.

 

환경은 mac M1이고, Clion으로 프로젝트를 만들었다. 아무 설정 없으면 file not found가 뜬다. 

헤더 파일을 못찾는다. 파일이 없으니까 못찾음. 

 

 

1.  터미널 열고  gcc 라이브러리 경로를 확인한다. 

/Library/Developer 어쩌구 경로가 보인다. 

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: arm64-apple-darwin21.1.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

2. 아래 명령으로 라이브러리 참조 경로로 이동하자. 

cd /Library/Developer/CommandLineTools/usr/include

3. 아래 명령으로 해당 경로에서 Finder를 열 수 있다. 

open ./

 

3. include 디렉토리 하위에 bits 라는 디렉토리를 만들자. 

 

4. bits 디렉토리 하위에 stdc++.h  파일을 하나 만든다. 

gcc-mirror 깃허브에서 코드를 받을 수 있다.

https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/precompiled/stdc%2B%2B.h

// C++ includes used for precompiling -*- C++ -*-

// Copyright (C) 2003-2013 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

/** @file stdc++.h
 *  This is an implementation file for a precompiled header.
 */

// 17.4.1.2 Headers

// C
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif

5. include 해서 실행되는지 확인하자. 

 


 

 

728x90

환경 

centOS7.5 

MariaDB 

 

목표

B테이블과 연관관계가 있는 A테이블을 삭제하고 싶음 

 

문제 상황 

MariaDB [bim_library]> delete from library_info where library_no between 1 and 50;
ERROR 1451 (23000): Cannot delete or update a parent row: 
a foreign key constraint fails 
(`bim_library`.`tag`, CONSTRAINT `FK2tk1sqt8jfmgqn7st8l73214` 
FOREIGN KEY (`library_no`) REFERENCES `library_info` (`library_no`))

 

해결 과정 

외래키를 해제해주는 명령어가 있었음 

set foreign_key_checks = 0;

테이블 드랍 하고, 

 

반드시 다시 외래키를 체크하는 옵션을 켜줘야 한다. 

set foreign_key_checks = 1;
728x90

@ColumnDefault

ddl-auto 조건이 create 또는 create-drop일 때

즉, 테이블을 처음 생성할 때 컬럼 기본값 제약조건을 정의해준다. 

컬럼에 붙이는 애노테이션.

 

Identifies the DEFAULT value to apply to the associated column via DDL.

DDL에 적용되는 기본 정의 라고 되어있다

Annotation Type ColumnDefault  hibernate javadoc 

 

@DynamicInsert

null이 아닌 값만 insert 해준다. 

만약, null이 들어온 경우, 제약조건에 명시된 기본값이 있다면 그것이 적용되어 insert 된다. 

테이블에 붙이는 애노테이션.

 

Annotation DynamicInsert hibernate userguide 


참고한 글 

JPA @ColumnDefault에 대한 오해, 컬럼 default 적용하기

jpa insert 시 default 값 적용 

테이블에 default 값 적용

728x90

목표 

pk로 엔티티를 조회 해온다. 

조회한 엔티티를 복제한다. 일부 내용만 바꾸고 새로운 pk를 가진 엔티티로써 저장한다. 

즉, 4번 pk 엔티티를 조회하여 복제한다. (4번 엔티티의 내용은 변경하지 않는다. )

일부 내용만 바꾼 후, 5번 엔티티로써 저장한다. 

찾아본 내용 

"jpa entity copy"로 구글링 했는데 stackoverflow의 How to clone a JPA entity 글이 있었다.

 "EntityManager.detach() 를 쓰세요." 

 

entityManager.detach()

엔티티 매니저가 관리하는 영속성 컨텍스트에서 분리된 상태가 된다. 

즉, 더티 체킹(변경 감지)의 대상에서 제외되는 것이다. 

준영속 상태로 만든 다음 데이터를 세팅하고, 다시 엔티티 매니저의 관리대상이 되도록 persist() 하라는 답변이었다. 

 

Member엔티티의 PK를 FK로 사용하는 엔티티의 정보까지 바뀌도록 신경써야 해서 삽질이 길었다. 

Member엔티티를 persist() 하기 전에,  FK로 연관된 엔티티들을 일일이 set해줬다. 

Member 엔티티와 연관관계에 있는 엔티티들은 전부 Cascade.Type All로 설계했기 때문에 다 연결되어 있었기 때문이다. 

 

수정한 예시 코드다. 

아래와 같은 흐름으로 수정하여 해결할 수 있었다. 

Long targetId = 1L;

Member oldMember = em.find(Member.class, targetId);
Hobby oldHobby = oldMember.getHobby();

em.detach(oldMember); // 준영속 상태로 만든다. (JPA가 관리하지 않는 객체가 된다)
oldMember.setName("minzy");
oldMember.setId(targetId + 1L); // PK를 1증가시킨다 

oldMember.setHobby(oldHobby); // 연관관계에 있는 엔티티 정보도 set해야 한다. 

em.persist(oldMember); // 영속성 컨텍스트의 1차 캐시에 올라가도록, 영속 상태로 만든다.

참고한 글 

JPA구동 방식

영속성 컨텍스트와 플러시 이해하기

 

[JPA] 영속성 컨텍스트와 플러시 이해하기

영속성 컨텍스트 JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과 영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자.

ict-nroo.tistory.com

 

728x90

+ Recent posts