오늘 겪은 문제 오늘은 페어와 함께 스프링부트로 간단한 인증/인가가 적용된 CRUD 게시판을 만드는 작업을 했다. 팀원이 작성했던 Lv1 코드를 기반으로 기능을 추가하기로 했는데 그 과정에서 예상치 못한 에러를 만났다. 시도해본 방법 1. 서비스 단 디버깅 회원가입 기능을 추가하는 과정에 위와 같은 에러를 만났다. 회원가입 과정은 Lv1 에서 했던 것과 별반 다를바 없이 클라이언트로부터 데이터를 입력 받고, 컨트롤러에서 이를 서비스에 넘긴 후, 서비스에서는 내부 로직에 따라 처리하고 DB에 저장한 후 그 결과를 컨트롤러에게 반환한다. 컨트롤러는 반환받은 결과를 클라이언트에게 전달하는 것으로 회원가입이 마무리가 된다. 컨트롤러는 단순히 데이터를 받고, 전달하는 역할을 수행하기에 서비스 단에서 문제가 있을 ..
IoC 와 DI 에 대해서 정리하려 합니다. IoC 와 DI 가 구체적으로 무엇인지 설명하기 전에 둘 사이의 관계를 짚고 넘어가면 좋을 것 같습니다. IoC 는 어떠한 개념이고 DI는 이러한 개념을 구현하기 위한 디자인 패턴이라고 이해하면 됩니다. IoC(Inversion of Control) 말 그대로 '제어의 역전'입니다. 보통 라이브러리와 프레임워크의 차이를 이야기할 때 '제어권이 누구한테 있느냐?'하는 이야기를 많이합니다. 일반적으로 우리가 개발을 할 때는 제어의 주도권은 당연히 개발자에게 있습니다. 개발자가 원하는 시점에 객체를 생성하고, 메서드를 호출하는 식으로 말이죠. class A { private B b; public A() { this.b = new B(); } } class B { }..
오늘은 스프링 Lv1 과제를 제출했다. 과제를 제로부터 설계하고 만들어가면서 MVC 패턴에 대한 이해를 좀 더 할 수 있었고 설계한 대로 만들었을 때 잘 동작하는 것을 보고 뿌듯함을 느낄 수도 있었다. 그리고 함께 항해를 이어가는 동료가 과제를 하는 데 어려움을 겪고 있어 어떤 게 어려운지 물어봤더니 나처럼 Dto? Entity? 언제 Dto 를 쓰는 거고 언제 Entity 를 쓰는 거지? 이 생성자는 왜 만드는 거지? 이런 부분들에 대한 어려움을 겪고 있었다. 그래서 동료에게 열심히 설명해주었고 동료도 혈이 뚫린 기분이라며 매우 만족했다. 오늘 TIL은 내가 동료에게 알려준 부분에 대해서 정리하려 한다. DTO ? Entity? 먼저 dto 객체와 entity 객체다. @Entity 어노테이션을 붙여서..
이번 주는 스프링을 학습하면서 라이브 특강도 듣게 되었는데 라이브 특강에서 HTTP 와 MVC 디자인 패턴에 대해서 배워 간단하게 정리를 해보려고 한다. HTTP 매번 주소창에 url로 입력해서 어디 접속할 때마다 http~~ https:~~ 이런 것 치긴 했는데 이게 뭔지는 이번 특강을 통해서 처음 알게 되었다. HTTP란 Hypertext Transfer Protocol 의 약자로 웹 브라우저 같은 곳에서 서버에게 필요한 정보를 요청하는 방법이다. 일종의 약속같은 거라고 생각하면 된다. HTTP는 크게 헤더와 바디로 구성되는데 헤더에는 HTTP 요청에 대한 정보들이 담기고 바디에는 서버에게 전달하려는 데이터가 담긴다. HTTP 메서드 종류 웹 브라우저가 서버에게 요청을 보내는 방법은 크게 4가지가 있..
오늘 MVC 구조를 공부하면서 헷갈렸던 DTO 와 VO 에 대해서 정리해보려고 한다. DTO(Data Transfer Object) MVC 구조에서는 계층을 크게 3계층으로 나눈다. 프레젠테이션 계층, 서비스 계층, 영속 계층. 계층들 간에 데이터를 주고 받을 일이 많은데 보통 하나의 데이터보다는 여러 데이터를 주고 받는 경우가 많기에 여러 데이터를 하나의 객체로 묶어서 전달을 하게 되는데 이것이 바로 DTO 다. DTO 는 일반적으로 3가지 형식을 지키면서 만들어질 수 있도록한다. 1) 파라미터가 없는 생성자를 가진다. 2) 속성(실질적으로 주고 받으려는 데이터)은 private 접근 제어자로 작성한다. 3) getter 와 setter 를 제공한다. VO(Value Object) 데이터 베이스에서는 ..
오늘 처음으로 스프링 학습에 들어갔는데 너무 당황스러웠다. 어노테이션이 등장하면서 내가 알던 자바의 법칙이 무너졌기 때문이다. 분명히 구현을 안 했는데 저 어노테이션 하나만 붙였더니 구현이 된 것처럼 동작하는 것을 보고 적지 않은 충격을 받았다. 그래서 오늘 수업에 나왔던 어노테이션에 대해서 정리해보고자 한다. @RequestMapping 클라이언트로부터 온 요청(Request)을 Controller에서 구현한 특정 메서드와 매핑하기 위해서 사용하는 어노테이션이다. @RequestMapping(value, method) 형태로 사용을 할 수 있는데 꼭 메서드가 아니라 클래스에도 매핑을 해줄 수 있다. 클래스에 매핑할 때는 @RequestMapping(value) 형태로 사용을 하고 저 value가 곧 u..
오늘 겪은 문제 알고리즘 주차 마지막 날이라서 시험을 봤다. 그 중 지뢰찾기 맵을 만드는 문제를 푸는데 IndexOutOfBoundsException 이 발생했다. 시도한 방법 로직을 다시 생각해봤지만 로직에는 문제가 없다고 생각해 얼마 전 항해 동료에게 배웠던 디버깅을 진행해봤다. IndexOutOfBoundsException 이 발생할 만한 라인(배열에서 값을 꺼내오는 라인)에 브레이크 포인트를 걸고 언제 Exception 이 발생하는 지를 확인했다. 그렇게 확인한 결과 지뢰찾기 맵을 만들기 위해서는 i, j 번째 칸의 주위 8 칸을 확인하는 과정이 필요했는데 이 때 IndexOutOfBoundsException 이 발생하는 것이었다. 해결 방법 인덱스에 조건을 걸어서 배열에서 값을 꺼내오는 인덱스가..
오늘은 동시성 문제에 대해서 학습하면서 알게 된 새로운 개념들에 대해 좀 정리를 해보려고 한다. 1. 원자성 2. 가시성 & CPU Cache 원자성 int i = 1; i = i + 2; 이렇게 코드를 실행하면 2번째 줄의 코드는 한 줄이지만 실제로는 총 3번의 연산이 이루어지는 것이다. 1. i 에 담긴 값을 읽어오고(Read) 2. 여기에 2를 더하고(Modify) 3. 다시 i 에 덮어써준다.(Write) 그래서 각각의 연산 사이에 시간텀이 발생하게 되고 만약 그 시간텀에 다른 스레드에서 i 라는 자원에 접근하면 예상치 못한 결과를 야기할 수 있는 것이다. 원자성이란 공유 자원에 대한 작업의 단위가 더 이상 쪼갤 수 없는 하나의 연산인 것처럼 동작하는것을 의미한다. 당장 i = i + 2 라는 작..