본문 바로가기

ETC73

당신은 트랜잭션에 대해 얼마나 알고 있는가 서론 최근 실무에서 작업하던 중 트랜잭션 때문에 이슈가 한번 있었다. 분명 롤백이 되지 않게끔 조치를 취해놓고 작업을 했지만 아래와 같은 오류가 발생하면서 롤백이 되어버렸다. Caused by: org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 전에 https://techblog.woowahan.com/2606 글도 보았고, https://dkswnkk.tistory.com/688 포스팅도 작성하면서 어느 정도 트랜잭션에 대해서 감을 잡았다고 생각했는데,, 실제로 문제가 발생하니 참 우울해졌다.. 마무리는 잘 .. 2023. 6. 6.
이진트리 탐색 운행법 이진트리(Binary Tree) 부모와 자식으로 나뉘어 있는 트리 그래프 노드의 최대 차수가 2이며, 각각 왼쪽 자식(left child), 와 오른쪽 자식(right child)으로 나뉩니다. 이진트리의 순회 이진트리의 순회에는 크게 아래의 세 가지 방법이 있습니다. 기본적으로 DFS는 전위 순회를 가장 많이 사용합니다. 전위 식(Preorder) : Root -> Left -> Right 중위 식(Inorder) : Left -> Root -> Right 후위 식(Postorder): Left -> Righjt-> Root 전위 순회 전위 순회는 루트 노드가 가장 먼저 나오는 순회 방식입니다. 중위 순회 중위 순회는 각 루트 노드가 자식노드의 사이에 위치합니다. 후위 순회 후위 순회는 루트노드가 가장.. 2022. 6. 21.
[DB] 트랜잭션(transaction)이란? 서론 Spring을 사용하여 개발하다 보면 service 단에서 @transaction 처리를 해줍니다. 항상 사용하면서 대충 느낌적으로 트랜잭션이 뭔지는 알겠으나 정확하게 입 밖으로 정리돼서 나오지가 않아 이번 기회에 정리를 하게 되었습니다. 트랜잭션(transaction) 트랜잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 논리적 단위입니다. 데이터 베이스의 상태를 변화시킨다는 말은 SELECT, INSERT, UPDATE, DELETE 등과 같은 조작어를 사용하는 행동을 의미합니다. 이런 트랜잭션은 상황에 따라 여러 개가 만들어 질 수 있고, 그 각각의 트랜잭션들은 상황에 따라 Commit(저장) 되거나 Rollback(철회) 될 수 있습니다. 커밋(Commit): 모든 부분작업이 정.. 2022. 6. 17.
[OS] (동기/비동기) 와 (블럭/논블록의) 차이 서론 os 관련하여 깃허브에서 면접 자료들을 살펴볼 때마다 (동기/비동기)와 (블록/논블록의) 차이를 물어보는 질문이 너무 많았습니다. 공룡 책을 정독할 때도 책에서 위와 같은 내용은 다루지 않았던 걸로 기억을 하는데 오늘 한번 개념을 확실하게 정리해 보려고 합니다. 블록(Block)과 논블록(Non-Block) 먼저 블록/논블록은 기술적으로 명확히 구분이 되며, 우리가 흔히 알고 있는 Block의 개념과 같습니다. A라는 함수를 실행했을 때, A라는 함수가 모든 행위를 끝마칠 때까지 기다렸다가 다른 함수가 실행되면 이것은 블로킹되었다고 합니다. 만약 A라는 함수를 호출했는데, A라는 함수의 로직이 끝나기도 전에 B라는 함수가 실행된다면 이것은 논블록킹 되었다고 합니다. 종류 예시 블럭(Block) - .. 2022. 4. 11.
[flutter] 무한스크롤 과 새로고침 (pull_to_refresh) 인스타그램, 당근 마켓, 페이스북과 같이 화면을 계속 스크롤하여 데이터를 불러오는 기능은 정보를 공유하는 앱에서 거의 필수적으로 사용되는 기능 중 하나입니다. 오늘은 Flutter에서 이러한 무한 스크롤을 쉽게 구현할 수 있는 방법과 더불어 새로고침 할 수 있는 기능까지 살펴보려고 합니다. pull_to_refresh | Flutter Package a widget provided to the flutter scroll component drop-down refresh and pull up load. pub.dev pull_to_refresh 위 주소의 pull_to_refresh 패키지를 사용하면 손쉽게 구현할 수 있습니다. 아래 코드는 위 패키지 Readme를 해석하여 주석을 달은 부분이다. 한번 훑.. 2022. 1. 22.
[Flutter] CocoaPods's specs repository is too out-of-date to satisfy dependencies error 필자는 현재 M1 13 Pro를 사용하고 있고, 플러터를 빌드하다 보면 한 번씩 아래와 같은 오류가 뜨면서 빌드가 되지 않을 때가 있다. Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies. To update the CocoaPods specs, run: pod repo update Error running pod install Error launching application on iPhone 13 Pro. CocoaPods의 설정이 깨졌거나, Firebase의 SDK의 버전 종속성이 맞지 않을 때 발생하는데 다음 명령어로 이 오류를 해결할 수 있다. 먼저 Window 혹은 Mac Intel chip 사용자의 경우.. 2022. 1. 13.
[flutter,dart] List의 filled/generate 생성자 개발을 하던 중 이차원 배열이 필요한 상황이 생겼고, Dart에서 C++, Java의 int arr[3][3]={0,} 와 같이 배열의 크기를 지정해줌과 동시에 초기화를 시킬 수 있는지 궁금했다. List twoDimensionalArray = List.filled( 3,(i) => List.generate(3, (_) => false, growable: false), growable: false); 위와 같이 filled 생성자를 사용하면 손쉽게 크기를 지정해줌과 초기값을 지정해 줄 수 있었다. growable의 경우 default값은 false이며 true일 경우 확장이 가능하다. 위 코드의 경우 twoDimensionalArray = [[false, false, false], [false, fals.. 2021. 12. 29.
[python] 클래스 변수와 __dict__ 파이썬에서 __dict__ 속성을 이용하면 클래스의 인스턴스 변수와 값에 쉽게 접근할 수 있다. class publicCircle: def __init__(self, name, radius): self.name = name self.radius = radius c1 = publicCircle('private', 1) print("c1의 속성들: " , c1.__dict__) # __dict__[key] 형식으로 value값만 따로 얻을 수도 있다. print(c1.__dict__['name']) print(c1.__dict__['radius']) 위 코드의 결과는 아래와 같다. c1의 속성들: {'name': 'private', 'radius': 1} private 1 또한 __dict__속성을 사용하면.. 2021. 12. 14.
[python] Broadcasting(브로드캐스팅) 브로드캐스팅 Broadcasting은 두 배열 간의 연산 과정을 수행할 때 배열 간 Shape가 다를 경우 두 배열 간의 형상을 맞추는 작업을 말한다. 아래와 같은 두 넘파이 배열이 있다고 가정하자. # 데모 배열 생성 a = np.arange(1, 25).reshape(4, 6) b = np.arange(25, 49).reshape(4, 6) print(a) [[ 1 2 3 4 5 6] [ 7 8 9 10 11 12] [13 14 15 16 17 18] [19 20 21 22 23 24]] print(b) [[25 26 27 28 29 30] [31 32 33 34 35 36] [37 38 39 40 41 42] [43 44 45 46 47 48]] Shape이 같은 배열의 이항 연산일 경우 위치가 같.. 2021. 12. 14.