오늘 한일

- Spring Security

  • 비밀번호 암호화 하여 저장하기 구현

  • 기존에 만든 로그인, 회원 가입을 Spring Security를 적용하여 바꾸는 중

  • 채용 중인 회사 찾아보기


오늘 느낀점

  • 처음부터 차근차근 Spring Security을 이용해서 개발하는 게 아니라 기존에 만들어져 있는 작업물에 적용을 하려니까 한 번에 신경 써야 할 것들이 많아서 생각보다 쉽게 안되고 있다. 그래서 일단 암호화하여 저장하는 부분을 먼저 구현해두고 나머지 작업을 진행 중이다.

일단 조금만 더 진행하다가 안되면 실습용 레파지리를 따로 만들어서 내가 학습한 사실을 사용하여 구현해 본 다음 기존 프로젝트에 적용해야겠다.


내일 할일

  • trello 구현하기

    • Spring Security를 사용한 로그인, 회원 가입 구현
  • 자소서 작성

오늘 한일

- trello 구현하기

  • User 클래스를 Member 클래스로 변경(그에 따라 Service, Repository 등 전부 변경)

  • authorization 설정

  • Role 클래스 생성

  • UserDetails 인터페이스를 상속한 SecurityMember 제작 중

- 질문 사항

  • BoardServiceBoardRepositoryUserRepository가 있는 것이 괜찮은가?

    User -> Board -> Deck -> Card 같은 형태라면
    ( User -> Board )-> ( Deck ) -> ( Card )
    Service를 위와 같이 경계를 구분 지어서 사용이 가능 하다.
    대신 서로간의 경계가 벗어난 Board와 Card의 레파지토리가 동시에 존재하는건 좋지 않다.

  • List<T>을 반복문을 통해 List<TDto> 형태로 변경 하는게 성능 상 안좋을 것 같다. 게다가 모든 게시물을 불러올 일이 있으면 수천개의 글에 대해 반복문이 돌아야 할 것이다. 그러다보니 중간에 Dto를 만드는 걸 포기했다.

    일단 수천개의 질문을 보내는 일은 없을 것이다.(많아봐야 한페이지에 10~20개)
    Dto를 쓴다는 것 자체가 T -> TDto로 변환을 해줘야 하는데 그것부터 성능 문제를 신경 안쓰이느냐?
    결론적으론 Dto를 쓴다는 것 자체가 변환 과정에 대한 성능은 고려 안하고 Dto를 사용하여 얻는 이점을 활용 하겠다는 것이다.

  • boards.html, board.html에 따른 Controller의 url 이름 문제.

    일단 현재 생긴 문제 기준으로 따지면 HomeController에서 해결 가능하다.
    boards.html이 트렐로의 index페이지 성격이 강한데, 로그인 된 사용자가 /요청이 오면 boards.html로 가고, 로그인이 안된 사람이 요청을 하면 현재의 index.html 페이지로 가게 하면 된다.
    현재까지는 HomeController를 단순히 바로 인덱스 페이지로 이동하는 방식으로만 사용했는데 위와같은 동작을 하게 추가 할 수도 있다.

  • VO란?

    일단 알다시피 불변객체로, 아래처럼 활용 가능 하다.

      public class User {
        private long id;
        private Account account;
        
        public User(long id, Account account){
        ...
        }
      }
    
      public class Account {
        private String name;
        private String password;
    
        public Account(String name, String password){
          ...
        }
      // 이후 setter 메서드는 절대 만들지 않고,
      // getter 혹은 equals를 만들어서 값(value)을 활용 한다.
     }
    

오늘 느낀점

  • 스타트 스프링 부트라는 책을 읽고 실습을 진행해보고 있는데 진행되는 과정이 이해는 되지만 따라 하는 느낌을 지울 수 없다. 그렇다고 없이 하자니 신경 써줘야 할 것들이 생각 보다 많아서 쉽진 않은 것 같다. 일단 내일 중으로 해당 부분은 마무리하고 자소서 작성을 해봐야겠다.

내일 할일

  • trello 구현하기

    • Spring Security를 사용한 로그인, 회원 가입 구현
  • 자소서 작성

오늘 한일

- 트렐로 리팩토링

  • 보통 URL 시작을 복수형(/boards)와 같이 구현 한다.

  • Service를 추가했다면 Controller에서 Repository 직접 접근하지 말고 구현을 BoardService로 위임한다.

  • @PostMapping("{bId}") 처럼 축약하지 않는다.

- 비밀번호 암호화 공부

  • 인증(authentication)

    애플리케이션의 사용자가 해당 사용자가 주장하는 본인이 맞는지 확인하는 절차

    보통 로그인과 같은 과정을 통해 본인이 맞는지 확인하는 과정

  • 인가(authorization)

    인증을 완료한 사용자가 특정 자원에 대해 접근할 수 있는 권한이 있는지의 여부를 확인하는 절차

    인가는 인증된 주체를 하나 이상의 권한(보통 역할)에 매핑하는 작업과 특정 자원에 대한 접근 권한이 있는지를 확인하는 작업으로 나뉜다.

  • 단방향 해시, 솔트(salt), 다이제스트

    다이제스트_생성

- DB 강의

  • 추천 도서 : 데이터베이스 첫걸음

  • MySQL 설치 방법

  • JOIN에 관한 내용

  • 트랜잭션의 성질, Lock, 트랜잭션 Isolation Level

    • MySQL default: Repeatable Read

    • MySQL 가능한 레벨

      READ-UNCOMMITTED
      READ-COMMITTED
      REPEATABLE-READ
      SERIALIZABLE


오늘 느낀점

  • 컨트롤러에대한 접근 URL을 만들면서 고민한 부분들을 포비가 피드백을 해주셔서 기분 좋게 고민을 할 수 있었다. 이전까지는 URL을 어떻게 만들지 확신이 안 섰는데 오늘의 피드백을 통해서 방향성을 잡아 갈 수 있을 것 같다. 추가로 URL쪽 한가지와 Service쪽에서 궁금한 부분이 있는데 그건 내일 질문 해야겠다.

  • 트렐로 기능 구현을 일주일 정도 걸려 일정부분 했는데 돌이켜 생각해보니 이렇게 오래 걸릴 부분은 아니였던 것 같다. 지금 하라고하면 모델을 고민하는 단계부터 2~3일이면 할 수 있을 것 같다. 시간을 많이 소비한 것 같아 아쉽긴 하지만 내가 어느 부분이 부족한지 알게 되었다.(디비디비디비, JPA) 또, 보안 공부를 바로 안하고 추가적으로 미비된 기능(Board, Deck, Card)을 구현 한 덕에 이제는 할 수 있다는 생각이 확실히 들게 된 것 같다.

    하지만 보안이 늦어진 만큼 해당 공부를 어디까지 할 수 있을지 모르겠는데 일단 빡시게 해봐야 겠다.

  • 호눅스의 디비 강의를 들었는데 디비를 바라보는 시각이 조금은 바뀐것 같다. 생각해보면 트랜잭션에 대해서 지금까지는 책의 설명만 봤는데 누군가의 강의를 듣는 경험은 처음인 대다가 그 사람이 무려 호눅스다 보니 재밌고 쉽게(일단 그 순간은…) 이해 할 수 있었다. 가장 큰 소득은 디비를 어떻게 공부 할 까 방향성을 잡을 수 있을 것 같다. 게다가 일단 추천 받은 책이 있는데 언제 볼지는 모르겠지만 내일 도착 할 듯 싶다.


내일 할일

  • trello 구현하기

    • 비밀번호 암호화 하여 저장, Spring Security 기반 로그인

오늘 한일

- Deck, Card 구현 완료

  • ManyToOne, OneToMany 관계로 테이블 작성

  • jQuery를 통한 웹 프론트 작업

  • 현재 지저분한 부분들 찾아 수정 중(완료시 pr 보낼 예정)


오늘 느낀점

  • 며칠간 JPA로 고생을 하고 나기도 했고, 작업이 까다롭게 느껴졌던 ManyToMany를 하고 난 뒤라 오늘 작업할 때는 JPA 때문에 고생을 한 부분은 없었다. 그러긴 해도 너무 많은 걸 JPA가 해주는데다 아직 잘 알지 못하는 상태서 사용을 하니까 찝찝한 부분과 잘 될까란 걱정을 하면서 진행을 하게 된 것 같다. (그런 부분에서 테스트 코드들이 정말 많은 도움이 됐다) JPA에 대해서는 제대로 알고 쓰냐고 물으면 아니라고 대답하겠지만 일단 눈 대중으로 사용할 정도는 된 것 같다.

    확실히 공부를 해서 잘 쓸 줄 알면 편할 것 같은데 JPA로 집중해서 공부하면 db에 대해서는 잘 모르는 상태가 유지될까 봐 그런 부분에서는 고민이 된다.(하긴 JPA도 잘 하려면 db도 잘 알아야 될 것 같다)

  • 오늘 작업은 생각보다 시간이 오래 걸렸는데 프론트 쪽에서 server로 원하는 정보를 어떻게 보내야 할지가 문제였다.(내 아이디어를 어떻게 코드로 작성할지에 대해서는 프론트분한테 일부 도움을 받았다) 썩 마음에 들진 않지만 일단 지금선에서 생각 나는 방법을 이용해서 작업을 해봤다.

    이럴 땐 프론트와 협업을 한다면 서로 데이터를 어떻게 주고받을지 정하고 AcceptanceTest 코드를 작성하여 초록불이 뜨는 것만 목표로 작업을 했을 텐데 초록불이 뜨면 프론트에서 컨트롤러에 파라미터에 맞게 데이터를 보내는 코드도 작업을 하느라 중간중간 흥이 깨지는 느낌이였다.

  • 제공된 템플릿에 삭제, 수정에 대해서는 버튼 및 자바스크립트 코드(정확히는 jQuery)가 제공되지 않아서 PUT, DELETE에 대해서는 Controller를 작성 안 했는데 클로이가 이슈 관리 시스템을 만들면서 해당 컨트롤러도 만든 걸 보니 너무 안일했나 싶어 자극을 받았다.

    안 만들고 있던 이유 중 하나는 모든 기능을 구현하기에는 시간이 부족할 것 같아서 일단 템플릿 위주로 작업을 진행했던 건데 조금은 안일했던 것 같다. 흠… 그래도 보안도 슬슬 진행하고 싶은데 오늘 집 가서 좀 더 고민해봐야겠다. 다만, 삭제, 수정을 진행하더라도 프론트에서 해당 이벤트까지 다 작성하기엔 벅찰 것 같아(내 프론트 작업 진행 속도를 생각한다면) Restful API 형태로만 구현을 할 것 같다.


내일 할일

  • trello 구현하기

    • 보안 시작 혹은 PUT, DELETE 메서드도 작성

15~16일 한일

- Board 생성 구현 완료

  • JPA를 통한 ManyToMany로 User, Board 테이블 구현

  • 뷰단에서 유저가 가지고 있는 Board 들을 정상적으로 출력하게 구현

  • JPA를 사용하는 기초적인 방법 숙지

    @Entity
    public class User {
      @ManyToMany
      @OrderBy("id ASC")
      @JoinTable(name = "board_list",
      joinColumns = @JoinColumn(name = "USER_ID"),
      inverseJoinColumns = @JoinColumn(name = "BOARD_ID"))
      private List<Board> boardList = new ArrayList<>();
    }
    
    @Entity
    public class Board {
      @ManyToMany(mappedBy = "boardList")
    	@OrderBy("id ASC")
    	private List<User> users = new ArrayList<>();
    }
    
    Board dbBoard = boardRepository.save(board);
    user.addBoard(board);
      	userRepository.save(user)
    

    조심해야 할 점 첫번째, 위의 user는 디비에서 가져온 user 야 한다. 두번째, OWNER 쪽인 user의 boardListadd를 한 다음 저장해야 한다. board_list에 대한 crud 가 일어날 때 보면 user 테이블을 기준(from)으로 동작한다. 셋째, board_list에 대한 insert 쿼리도 xxRepository.save(xx)가 수행될 때 실행된다. 사실 이 부분을 List에 add를 할 때 자동적으로 되지 않을까 착각을 했다.(그래서 콘솔에 insert 쿼리가 안 떠서 관계를 잘 못 맺었나 고민만 했다)

    아마 꽤나 틀린 부분도 있을 텐데 차후 JPA에 집중할 여력이 될 때 한번 제대로 공부해 봐야겠다.

    추가) 기본 생성자도 만들어 줘야 한다.


15~16일 느낀점

  • 데이터 베이스를 안 썼다면 쉽게 지나갔을 것 같은 부분이었는데 해당 부분에서 엄청나게 고생을 했다… 중간에 포비의 조언으로 해결이 됐다고 느꼈는데 착각이었다. 뒤에 지저분한 코드들을 수정하는 과정에서 조언을 통해 해결한 부분이 와르르 무너졌다.

    다시 오전과 같은 상황이 되어버려서는 멘붕…(무기력한 상태는 아니고 어렵지 않은 내용인데 왜 못할까 나한테 화나고 오기가 생기더라) 도저히 해결이 안 돼서 다시 한번 포비한테 질문을 해서 해결을 했는데 정말 기초적인 부분을 놓치고 있었다.

    컴퓨터가 똑똑하지 못하다는 건 알고 있었는데 JPA가 일정 부분 쉽게 처리를 해주기도 하고 JPA를 잘 모른다는 미명하에 사용자가 신경 써야 할 부분을 간과하고 알아서 다 해줄 거라는 착각을 해 버린 게 문제였다.

    후아.. 어떻게든 해결돼서 구현은 완료했는데 아직 능숙하게 사용하지도, 기본적인 사용법도 잘 안다고는 말 못하겠다. 모래성을 쌓은 형태인데 당장은 심적으로도 시간적으로도 여력이 안되므로 사용법을 숙지만 해두고 언젠가는 제대로 공부해봐야겠다. 아직도 왜 못했을까 스스로한테 분하다.

  • 카우한테 직접적인 지식에 대해서도 도움을 많이 받았지만, 가장 도움이 된 말은 객체는 테이블의 데이터를 표현하는 일종의 도구라고 생각하라는 말이었다.(정확히는 기억 안 나지만 이런 느낌의 말이었던 거로 기억한다) 그전까지는 이 둘을 자바스크립트에서의 == 정도로의 느낌으로 받아들였던 것 같다. 특히나 모델에 기능들이 들어가므로 모델을 더 중요시 생각했던 것 같기도 하다.

    저 말을 듣기 전까지는 객체 자체도 데이터로 생각을 하고 도리어 테이블을 도구쯤으로 생각했던 것 같다. 다른 부분은 관점의 차이일 수도 있겠지만 핵심적인 요지는 데이터 자체는 테이블 쪽이라는 것!! 그나마 이러한 생각이 들기 시작하니까 디비를 사용하는데 있어 생겼던 어색함을 많이 덜어 낼 수 있었던 것 같다.

  • 보안 쪽도 공부를 해보고 싶고, 트렐로의 기능을 다 구현하진 못하더라도 Card 구현까지는 해 보고 싶은데, 후자 같은 경우는 오래 걸리지는 않을 것 같아 일단은 내일 저녁까지는 구현하고 보안 부분을 구현할까 싶다. 특히 JPA를 어설프더라도 간단히는 사용할 줄 아나 복습 겸 반복 학습을 해봐야겠다.


내일 할일

  • trello 구현하기

    • Card 구현(그렇게 되면 Board 내부, Deck까지 구현) 혹은 보안 구현 시작