전체 글
@Transactional과 @Transactional(readOnly = true) 차이
서론 지하철 노선도 미션에서 리뷰어에게 다음과 같은 피드백을 받았습니다. @Transactional과 @Transactional(readOnly = true)은 어떻게 다른지, 왜 사용했는지 공유해주실 수 있나요~? 그에 대한 저의 답변입니다. @Transactional(readOnly = true)을 사용한 이유는 명령쿼리분리원칙 때문입니다. 조회 쿼리만을 사용하는 메서드에는 readOnly = true을 붙여 상태를 변경시키는 행위(생성,수정,삭제)를 금지할 수 있습니다. 또한, readOnly = true가 메서드에 붙어있다면, 다른사람이 보기에 이 메서드는 상태를 변경시키지 않는 쿼리라고 생각할테니 프로그램의 안정성에 기여할 것이라는 생각을 했었습니다. readOnly=true를 사용함으로써 얻을..
Lv1 레벨로그
Lv1에서 좋은 코드가 무엇인가에 대해 배웠습니다. 좋은 코드의 기준 중 하나는 유지보수가 용이한 코드라고 생각합니다. 1. MVC 구조 Model : 데이터와 관련된 부분 View : 사용자한테 보여지는 부분 Controller : Model과 View를 이어주는 부분 1) MVC 구조 설계 시 주의사항 Model은 View에 관한 코드를 가지면 안된다. 컨트롤러는 thread-safe 해야만 한다. 즉, thread-safe하지 않은 상태를 가지면 안된다. 2. if-else가 계속 반복되는 구조에 대응 1) Enum 활용 Enum은 비슷한 속성을 묶는 기능을 한다. Enum을 사용함으로써 얻는 장점 다른 사람이 봐도 비슷한 속성임을 알 수 있다. => 불필요한 문서화를 줄인다. 컴파일 단계에서 에러..
컨트롤러는 상태를 가지면 안된다.
이번 글에서는 컨트롤러가 상태를 가지면 안되는 이유에 대해서 이야기해보고자 합니다. 서론 로또 미션을 진행하면서 다음과 같이 컨트롤러 내 인스턴스 변수로 발행한 로또와 당첨번호를 저장했었습니다. 피드백을 통해 이러한 방식에 문제가 있다는 사실을 알게 되었습니다. public class LottoController { private Lottos lottos; private LottoWinningNumbers lottoWinningNumbers; // ... } 컨트롤러와 모델의 차이점 위 방식에 문제가 있다는 사실을 알고 나서 문득 한가지 의문이 들었습니다. '컨트롤러가 왜 상태를 가지면 안될까? 그럼 모델이 상태를 가져져도 되는 이유는 뭐지?' 잠시 MVC 구조를 짚고 넘어가겠습니다. MVC에서 Mode..
MAC 주소와 ARP
1. MAC 주소 OSI 7계층에서 각 계층은 독립적인 주소를 갖는다. 애플리케이션 계층에서는 호스트 이름, 네트워크 계층에서는 IP 주소, 그리고 링크 계층에선 바로 이 MAC 주소를 갖는다. 실제로 MAC 주소를 갖는 것은 호스트나 라우터가 아닌 호스트나 라우터에 삽입된 NIC(네트워크 인터페이스 카드)이다. 그래서 NIC를 여러개 갖고 있으면 MAC 주소도 여러개 갖고 있다. MAC 주소는 소프트웨어을 통해 바꿀 수 있지만, 보통은 NIC에 고정된 식별자이다. IP 주소는 호스트가 이동하면서 변하는 것과 달리 MAC 주소는 NIC에 고정되어 변하지 않는다. 그래서 IP 주소는 우편 주소, MAC 주소는 주민등록번호에 비유할 수 있다. IP 주소와 MAC 주소 모두 호스트를 지칭하는 주소이다. 2. ..
MAC 프로토콜 종류와 특징
네트워크 링크에는 두 종류가 있다. 점대점 링크와 브로드캐스트 링크이다. 점대점 링크는 송신자와 수신자가 하나의 링크로 연결된 것이고, 브로드캐스트 링크는 하나의 공유된 브로드캐스트 채널에 다수의 송/수신 노드가 연결된 것이다. 우리가 쓰는 대부분의 컴퓨터네트워크는 브로드캐스트 링크를 사용한다. 브로드캐스트 링크는 많은 사람들이 대화하는 파티로 비유할 수 있다. 파티에서는 여러 사람들이 동시에 말을 한다. 그러나 네트워크에서는 동시에 데이터를 전송하게 되면 충돌이 발생하고, 수신 노드는 받은 데이터를 처리할 수 없게 된다. 그래서 충돌을 방지하기 위해 노드 간의 접속을 조정할 필요가 있다. 이것은 다중 접속 프로토콜이 해결해야할 문제이며, 이를 해결하기 위해 수많은 방법이 고안되었다. 이러한 방법을 MA..
💻2021년 회고록
올 한 해의 시작과 끝은 알고리즘이었다. 백엔드 직군으로 커리어를 시작하기로 결심한 나는, 캐글 도전을 마무리하고 4월부터 알고리즘 공부를 본격적으로 시작했다. 매일 퇴근 후 새벽 한 두시까지 알고리즘 문제를 풀었다. 반년 동안 백준, 프로그래머스, Leetcode를 통틀어 약 100여개 정도의 문제를 푼 것 같다. 덕분에 네이버웹툰, NHN 코딩테스트를 통과했으나, 그 다음 단계에서 번번히 탈락하고 말았다. 알고리즘 실력이 어느정도 안정된 뒤로부터는 운영체제, 네트워크와 같은 CS 공부를 병행했다. 알고리즘 공부를 계속하면서, 아침 7시에 회사에 출근해 인강을 2개씩 듣고 배운 내용을 블로그에 정리했다. 한 두달이면 끝날 줄 알았는데, 내용이 워낙 방대하여 운영체제 과목을 1회독 하는 데만 3개월이 걸..
[우아한테크코스 4기] 프리코스 및 최종코딩테스트 후기
3주 간의 프리코스와 최종 코딩테스트가 엊그제 마무리되었다. 최종코딩테스트에서 모든 기능을 구현하지 못했고, 심지어 테스트코드도 절반만 통과했다. 테스트 종료 후 끝났다는 후련함과 아쉬움이 함께 밀려왔다. 그러나, 한달 동안 나 스스로도 많이 성장했다고 느낀 부분이 있기 때문에 그것들을 기록으로 남겨본다. 최대한 많은 지원자에게 성장의 기회를 제공한다. 프리코스는 1주차 함수의 분리, 2주차 클래스의 분리, 3주차 여러 클래스의 분리라는 테마로 진행된다. 시간이 지날수록 난이도가 점점 상승한다. 특히 3주차와 최종 코딩테스트는 2주차에 비해 10배 이상 어렵다고 느껴졌다. 프리코스에서 가장 인상적이었던 부분은 명확한 해답을 제공하지 않는다는 점이다. 각 미션마다 요구사항과 제약사항이 주어질 뿐이다. 기능..
자바 추상클래스와 인터페이스
추상 클래스와 인터페이스의 차이에 대해 설명해주세요. 1. 추상메소드와 추상클래스 추상 메소드는 빈 껍데기이다. 추상메소드란 선언은 되어 있으나 코드가 구현되지 않은 것을 말한다. //추상 메소드 public abstract String getName(); //추상 메소드가 아님. why? 코드가 구현되어 있기 때문에! public abstract String getName() { return "hello"; } 추상 클래스를 사용하는 이유 : 추상 클래스를 상속받은 클래스는 추상 클래스 안에 있는 모든 추상 메소드를 구현해야 한다. 위 설명만 들으면 인터페이스와 추상 클래스가 같다고 느낄 수 있다. 인터페이스도 인터페이스 안에 있는 모든 추상메소드를 구현해야하기 때문이다. 2. 인터페이스 vs 추상클래..