728x90

(1) WIL(Weekly I Learned) - 9~10주차

  • 4/23일 드디어 기다리던 마지막 주차인 최종 프로젝트가 시작되었습니다.
  • 팀은 총 7인 백엔드(Spring) 3분(저 포함), 프론트엔드(React) 3분으로 구성되었으며 최종프로젝트 인 만큼 디자이너 1분도 포함되어 프로젝트를 진행하였습니다.

(2) 일정

  • 4/25 - S.A 제출
  • 4/26 12:00 ~ 17:00 - 팀 별 시작 면담
  • 4/30 10:00 ~ 15:00 - 팀 별 1차 면담
  • 5/5 19:00 ~ 20:00 - 미소 협력사 발표
  • 5/8 17:30 ~ 18:30 - 미니프로젝트 코드기반 코드리뷰 (이태훈 튜터님)
  • 5/13 자정까지 - 팀 별 중간 결과물 제출
  • 5/27 자정까지 - 팀 별 최종 결과물 제출

(3) 배운점

  • WebDriver를 이용한 크롤링
  • JPA와 Pageable을 이용한 페이징 처리
  • nativeQuery
  • JPQL
  • Junit5 TestCode 작성
  • @Scheduler

(4) 최종 프로젝트


(5) 느낀점

  • 최근 항해99에서 만난 사람들과 오프라인에서 만났다. 다들 시간이 없어 일요일에 약속을 잡아 오랜만에 회고록을 쓰게 되었습니다... 반성하는 시간이 되네요.
  • 최종 프로젝트는 미니 프로젝트가 끝나기 전에 얘기를 맞췄던 분들과 팀이 구성이 되었고 거기에 더해 프론트 한분, 백엔드 한분이 추가되어 팀이 결정 되었습니다.(디자이너분은 팀 결정과 함께 스파르타에서 연결 시켜주셨습니다.)
  • 최종프로젝트가 진행되면서 이전에 신경쓰지 않았던 보안부분에 대해 http -> https로 변경하는 등 많은 신경을 쓰게 되었습니다. 또한 무중단 배포를 통하여 서비스가 끊기지 않고 업데이트를 할 수 있도록 설계를 하였습니다. 어려운 기능보다는 사용자 경험, 완벽한 기능을 만드는 것에 초점을 두고 만들어 이전 프로젝트에 비해 적은 스코프를 가지고 만들었지만 시간은 더 들었습니다.
  • 다음주가 되면 실제 서비스를 배포할 가능성이 높아 많은 기대를 하고있습니다.

반응형
728x90

(1) WIL(Weekly I Learned) - 7~8주차

  • 4/9일 항해를 시작한 후 처음으로 프로젝트 진행 기간이 2주인 미니 프로젝트 주차가 시작되었습니다.
  • 팀은 총 4인 백엔드(Spring) 2분(저 포함), 프론트엔드(React) 2분으로 구성되었으며 다시 팀장을 맡게되었습니다.
  • 이전 클론코딩에서의 부족함을 느낀분들을 위해 캐치업 조가 새로 생겨 프로젝트 조, 캐치업 조를 본인이 선택 하여 들어갈 수 있도록 변화가 생겼습니다.

(2) 일정

  • 4/9 - S.A 제출 / 주제 선정 / 와이어프레임 / API설계 / 중간점검 목표 / 2주 진행 계획
  • 4/10 - 튜터 서면 피드백
  • 4/14 - Deer, 알파카 협력사 발표
  • 4/16 - 팀 별 중간체크 / 발제 없음1) WIL(Weekly I Learned) - 7주차
  • 4/22 자정까지 - 결과물 제출
  • 4/23 10:00 ~ 11:00 - 둘러보기
  • 4/23 11:00 - 실전프로젝트 발제

(3) 배운점

  • Web Socket 통신을 이용한 채팅
  • Embedded Redis 사용
  • Spring Security 와 JWT 혼합 사용
  • HtmlEmail객체를 이용한 Email 보내기
    • 비밀번호 찾기를 위해 사용
  • 카카오 소셜로그인
    • 프론트엔드에서 처리 후 카카오에서 받은 Token을 백엔드로 넘겨주어 해당 유저 정보를 DB에 저장 및 JWT 생성 후 프론트엔드로 새로 생성된 Token을 발급

(4) 미니 프로젝트


(5) 느낀점

  • 다들 자신의 주특기에 자신있는 분들을 만나 프로젝트를 순조롭게 진행 할 수 있어 4/16 중간체크 이전 까지 주요 기능인 채팅을 완성할 수 있었습니다.
  • 지금까지 정확한 시간계획 없이 프로젝트 진행, 주특기 공부 등을 하고 있어 정리가 잘 안되는 느낌을 받아 항해 99에서 만난 분들과 시간을 정해 알고리즘 공부를 하기로 하였습니다. 21:30 ~ 23:30 까지 Python 을 이용하여 프로그래머스, 백준 알고리즘 을 풀어 서로 도움되는 시간을 가질 수 있고, 지속적으로 알고리즘을 공부함으로 알고리즘에 익숙해 질 수 있을 것 같습니다.
  • 채팅을 만들며 기본 CRUD를 사용하는 것이 아닌 WebSocket통신을 접할 수 있어 알림, 채팅 등 실시간으로 이루어지는 것에 대해 조금이나마 이해할 수 있었습니다. 아직 Redis에 대해서는 더 공부해야 할 필요성을 느꼇습니다.
  • 처음 WebSocket을 이용하여 채팅을 구현한 것이여서 기분이 매우 좋았으며, 팀원분들과 직접 구현한 채팅 페이지에서 채팅을 하며 소소한 즐거움을 얻을 수 있었습니다.
  • 카카오 소셜로그인은 심화 Spring강의에서 한 프로젝트 안에 백엔드, 프론트엔드가 공존할때에만 구현한 경험이 있어 이를 토대로 소셜로그인을 React와 같이 하려 했지만 Redirect하는 부분에서 Token을 어떻게 넘겨줘야하는지에 문제가 있어 프론트엔드에서 카카오Token을 백엔드로 넘겨주는 방식으로 해결하였습니다. 이게 올바른 방법인지는 아직 해답을 찾이 못하였으나 마지막 코드리뷰때 문의할 예정입니다.
  • 비밀번호 변경하는 방법을 메일보내는 것을 통해 구현하였습니다. 비밀번호 찾기 시 랜덤한 인증번호를 메일과 프론트엔드에 보내어 인증번호를 올바르게 입력하였을때 비밀번호를 변경 할 수 있는 페이지에 나오게 하였는데, 그리 어려운 기능은 아니였지만 Spring boot 코드에서 메일을 보내는 기능을 추가 하여 재밌는 경험이였습니다.

반응형
728x90

(1) 유효성 검사(Validation) 란?

  • 어떤 데이터의 값이 유효한지, 타당한지 확인하는 것을 의미합니다.
  • 보안적인 측면에서 올바르지 않는 데이터가 서버로 전송되거나 DB에 전송되지 않도록 하는 것입니다.

(2) 관련 어노테이션

  • JSR-303 Validator
    • @AssertFalse - 거짓인가?
    • @AssertTrue - 참인가?
    • @Max - 지정 값 이하인가?
    • @Min - 지정 값 이상인가?
    • @DecimalMax - 지정 값 이하 실수인가?
    • @DecimalMin - 지정 값 이상 실수인가?
    • @NotNull - Null이 아닌가?
    • @Null - Null 인가?
    • @Digits (integer=, fraction=) - 대상 수가 지정된 정수, 소수 자리 수 이내인가?
    • @Pattern(regex=,flag=) - 정규식을 만족 하는가?
    • @Future - 미래날짜인가?
    • @Past - 과거 날짜인가?
    • @Size(min=, max=) - 문자열, 배열 등의 크기가 지정크기를 만족 하는가?
  • Hibernate
    • @NotEmpty - Empty 값이 아닌가?
    • @Email - 이메일 형식인가?
    • @URL - URL 형식인가?
    • @Length(min=, max=) - 문자열의 길이가 min과 max 사이인가?
    • @Range(min=, max=) - 숫자 범위가 min과 max 사이인가?

(3) 사용법

  • build.gradle
dependencies {
	compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    
    // https://mvnrepository.com/artifact/org.json/json
    implementation group: 'org.json', name: 'json', version: '20160810'
    
	implementation 'org.springframework.boot:spring-boot-starter-validation:2.3.3.RELEASE'
}
  • DTO
    @NotNull
    @NotBlank(message = "이메일 입력은 필수입니다.")
    @Email(message = "이메일 형식으로 입력해 주세요.")
    private String email;

    @NotNull
    @NotBlank(message = "비밀번호 입력은 필수입니다.")
    private String password;
  • Controller
    //회원 가입
    @PostMapping("/api/user/signup")
    public Object registerUsers(@Valid @RequestBody UserSignupRequestDto userSignupRequestDto){

    }
  • ErrorCode
import lombok.Getter;

public enum ErrorCode {

    NOT_NULL("ERROR_CODE_NOT_NULL","필수값이 누락되었습니다.")
    , MIN_VALUE("ERROR_CODE_MIN_VALUE", "최소값보다 커야 합니다.")
    , PATTERN("ERROR_CODE_PATTERN","값 형식이 다릅니다.")
    , NOT_BLANK("ERROR_CODE_NOT_BLANK","필수값이 누락되었습니다.")
    , EMAIL("ERROR_CODE_EMAIL","이메일 형식이 아닙니다.")
    ;

    @Getter
    private String code;

    @Getter
    private String description;

    ErrorCode(String code, String description) {
        this.code = code;
        this.description = description;
    }
}
  • ErrorResponse
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class ErrorResponse {

    private String code;

    private String description;

    private String errorMessage;

    public ErrorResponse(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public ErrorResponse(String code, String description, String errorMessage) {
        this.code = code;
        this.description = description;
        this.errorMessage = errorMessage;
    }
}
  • ExceptionController
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

@Slf4j
@ControllerAdvice
public class ExceptionController {

    /**
     * @valid  유효성체크에 통과하지 못하면  MethodArgumentNotValidException 이 발생한다.
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> methodValidException(MethodArgumentNotValidException e, HttpServletRequest request){
        log.warn("MethodArgumentNotValidException 발생!!! url:{}, trace:{}",request.getRequestURI(), e.getStackTrace());
        ErrorResponse errorResponse = makeErrorResponse(e.getBindingResult());
        return new ResponseEntity<ErrorResponse>(errorResponse, HttpStatus.BAD_REQUEST);
    }

    private ErrorResponse makeErrorResponse(BindingResult bindingResult){
        String code = "";
        String description = "";
        String errorMessage = "";

        //에러가 있다면
        if(bindingResult.hasErrors()){
            //DTO에 설정한 meaasge값을 가져온다
            errorMessage = bindingResult.getFieldError().getDefaultMessage();

            //DTO에 유효성체크를 걸어놓은 어노테이션명을 가져온다.
            String bindResultCode = bindingResult.getFieldError().getCode();

//            switch (bindResultCode){
            switch (Objects.requireNonNull(bindResultCode)){
                case "NotNull":
                    code = ErrorCode.NOT_NULL.getCode();
                    description = ErrorCode.NOT_NULL.getDescription();
                    break;
                case "NotBlank":
                    code = ErrorCode.NOT_BLANK.getCode();
                    description = ErrorCode.NOT_BLANK.getDescription();
                    break;
                case "Min":
                    code = ErrorCode.MIN_VALUE.getCode();
                    description = ErrorCode.MIN_VALUE.getDescription();
                    break;
                case "Pattern":
                    code = ErrorCode.PATTERN.getCode();
                    description = ErrorCode.PATTERN.getDescription();
                    break;
                case "Email":
                    code = ErrorCode.EMAIL.getCode();
                    description = ErrorCode.EMAIL.getDescription();
                    break;
            }
        }

        return new ErrorResponse(code, description, errorMessage);
    }
}

 

  • Controller에서 @Valid 어노테이션이 붙은 값이 넘어왔을때 DTO에서 지정해준 조건에 맞지 않는다면 ExceptionController의 makeErrorResponse 함수가 작동하게 되고, 프론트엔드로 ErrorCode에서 지정해준 값과 DTO에 지정해준 Message가 Response Body에 담겨 프론트엔드로 응답하게 됩니다.

반응형

'Study > Spring' 카테고리의 다른 글

[Spring] QueryDSL-JPA  (0) 2024.12.30
[Spring] @InitBinder  (0) 2021.08.08
[Spring] @Data 어노테이션  (0) 2021.06.30
[Spring] 영속성 컨텍스트 (Persistence Context)  (0) 2021.06.30
[Spring Boot] Spring 프레임워크  (2) 2021.06.26
728x90

(1) WIL(Weekly I Learned) - 6주차

  • 4/2일 아쉬웠던 주특기(Spring) 심화가 끝나고 드디어 기다리던 클론코딩 프로젝트가 시작되었습니다.
  • 팀은 총 4인 백엔드(Spring) 2분(저 포함), 프론트엔드(React) 2분으로 구성되었으며 또 다시 팀장을 맡게되었습니다.

(2) 일정

  • 4/2 1차멘토링 전까지 - S.A완료
  • 4/5 ~ 4/6 - 2차 멘토링
  • 4/8 - '쌀 팔다 개발자' 김병욱님 강연
  • 4/8 자정까지 - 클론코딩 결과물 제출
  • 4/9 10:00 ~ 11:00 - 다른조 클론코딩 둘러보기
  • 4/9 11:00 - 미니프로젝트2 발제

(3) 배운점

  • S3를 이용한 이미지 업로드
  • CORS - 타 IP에서 접근을 허용
  • Spring Boot 에서의 JWT 토큰 사용
  • @Valid - 유효성 검사
  • Git - Pull Request
  • Controller 예외처리 및 에러 메세지 보내기

 

 


(4) 클론 코딩


(5) 느낀점

  • 처음으로 백엔드와 프론트엔드로 나누어 프로젝트를 진행하는 경험을 할 수 있었습니다. 혼자만의 속도가 아닌 팀원 전체의 속도에 맞추다보니 완벽하게 프로젝트를 마무리 하지 못하여 아쉬움이 있었지만 그래도 여러사람과의 협업을 통해 프로젝트를 진행 해보았다라는것에 의미가 있었습니다.
  • 매 주차마다 제출하는 단원평가에 코드리뷰, 피드백이 없다 등 아쉬움점을 적어서 인지 스파르타에서 14시~16시에 튜터님이 상시 대기하며 질문 받는 코너가 새로 생겨 프로젝트를 진행 하다 막히는 부분이나 이론상 이해가 안되는 부분이 있으면 물어볼 수 있어 좋았습니다.

반응형
728x90

(1) WIL(Weekly I Learned) - 5주차

  • 3/26일 이전 주특기(Spring)기본을 끝마치고 5주차 주특기(Spring)심화 가 시작되었습니다.
  • 이전과 달리 두분 다 처음보는 분들과 팀원이 되었으며, 랜덤으로 지정된다는 팀장역할을 처음 하게되었습니다.

(2) 일정

  • 3/29 (13:30 ~ 16:30) - 소규모 면담 (신청자 한에서)
  • 3/31 (19:00 ~ 20:00) - 항해톡 (SSL, JWT, index(database), ORM) 크루원 중 신청자 발표
  • 4/1 까지 숙제 완료!
  • 4/2 (~10:00) - 클론 코딩 발제

(3) 배운점

  • Controller
    • Servlet
    • Controller
    • RestController
  • DI
  • Bean
  • IoC
  • 스프링 시큐리티
    • 소셜로그인(카카오)
    • OAuth
  • 테스트 케이스
    • JUnit
    • Mock, Mockito
    • 통합 테스트
  • 영속성

(4) 기본 과제

  • 조건
    • 회원가입
      • 닉네임, 비밀번호 조건에 안맞는경우 에러메세지
    • 로그인 및 검사
    • 소셜로그인
    • 게시글 / 댓글 조회
    • 댓글 작성 / 수정 / 삭제 (로그인 및 자기가 작성한 사용자만)
    • 회원가입 테스트 코드 작성
  • 링크 - loafly.shop/ (현재 닫은 상태)

(5) 느낀점

  • 심화에서는 기본에서 배웠던것에 대한 전체적인 리뷰와 Servlet을사용한 코드, Controller와 RestController를 사용한 코드 등 여러 방법에 대해 배웠습니다.
  • Spring 시큐리티를 이용한 로그인 기능과 소셜로그인 기능을 구성 해 봄으로써 Spring에서 로그인은 기본적으로 도움을 주는 기능들이 있구나 느꼇습니다.
  • 전체적으로 강의 내용이 코드를 전체복사, 붙여넣기 방식으로 진행되어 이해하지 못한부분도 많이 있어 다른강의를 보거나 개인적으로 공부하여 스프링에 대해 더 자세히 알아야 할 필요가 있다고 느꼇습니다.
  • 과제를 해도 코드리뷰, 과제답안 등 피드백이 없어 과제를 잘했는지 잘 못했는지 감을 잡을 수 없어 아쉬움이 있습니다.

반응형
728x90

(1) WIL(Weekly I Learned) - 4주차

  • 3/19일 이전 알고리즘주차(2주)를 끝마치고 4주차 주특기주차가 시작되었습니다.
  • 주특기(Spring)을 선택한 저는 Spring을 선택한 분들과 같은조가 되었다.
  • 이제 본격적인 주특기를 배워봅시다!

(2) 일정

  • 3/23 (16:00 ~ 18:00) - 소규모 면담 (신청자 한에서)
  • 3/24 (19:00 ~ 20:00) - 항해톡 (try-catch예외처리, Git Github, 쿠키 세션 캐시, DNS) 크루원 중 신청자 발표
  • 3/25 까지 숙제 완료!
  • 3/26 (~10:00) - 주특기 심화 발제

(3) 배운점

  • IntelliJ
  • 자바
    • 자바 기초문법
    • 클래스
    • private, public
    • Getter, Setter
  • Gradle이란?
  • RDBMS
  • Spring boot
    • H2
    • JPA
    • Lombok
    • DTO
    • Controller
    • Service
    • Repository
  • ARC

(4) 기본 과제

  • 조건
    • 서비스 완성
      • 전체 게시글 목록 조회 페이지
      • 게시글 작성 페이지
      • 게시글 조회 페이지
    • AWS 배포
      • RDS 연결
      • EC2 배포
  • 링크 - loafly.shop/

(5) 느낀점

  • 기본적인 RestFul api 사용, IntelliJ 사용법 에 대해 익혀 간단한 게시판을 만들었습니다.
  • Spring을 배우면서 Getter, Setter 등 여러 어노테이션을 배우면서 사용에 대한 편리함을 느꼇습니다.
  • 이전 Python Flask를 이용하여 만든 경험이 있어 그렇게 어려운부분은 없었으나 RestController에서 페이지 이동하는 방법을 몰라 많은 고민을 했었습니다. 결국 Controller를 따로 추가 하여 View에 접근하는 것을 해결했습니다.
  • JPA가 Java를 SQL언어로 자동으로 번역 해주는 편리성을 가지고 있어 스프링에 또한번 반했습니다.
  • ARC를 통해 프론트엔드를 만들지 않고 api를 테스트 해볼수 있다는것이 신기했고 새로운걷을 배워 좋은 경험을 했습니다.

반응형
728x90

(1) WIL(Weekly I Learned) - 3주차

  • 3/12일 이전 2주차가 알고리즘을 이어서 3주차 알고리즘이 시작되었습니다.
  • 2주차 동안 같이 프로젝트를 진행했던 팀원분들과는 헤어지고 랜덤으로 생성된 다른 팀으로 재조정 되었습니다.
    • (2주차에서 같은조였던 분과 3주차에서도 같은조가 되었습니다.)
  • 2주차 보단 어려운 문제들로 이루어져 총 35문제를 각자의 속도로 제시된 문제들을 모두 풀면 됩니다.

(2) 일정

  • 3/12 (09:00 ~ 12:00) - 항해 99내에서 진행하는 코딩 테스트 진행(3문제) 및 코드설명(youtube올리기) 1문제
  • 3/12 ~ 3/18 - 권장요일에 맞는 문제풀이 
  • 3/17 (15:00 ~ 16:00) - 주특기 면담
  • 3/17 (22:00) - 주특기 선택 완료
  • 3/19 (09:00 ~ 12:00) - 항해 99내에서 진행하는 코딩 테스트 진행(3문제) 및 코드설명(youtube올리기) 1문제
  • 3/19 - Spring, Node.js, React, React Native 주특기가 같은 주특기끼리 조 변경

(3) 배운점

  • 알고리즘
    • 브루트포스
    • 그리디 알고리즘
    • 분할정복
    • 백트래킹

(4) 문제풀이


(5) 느낀점

  • 항해99를 시작한지 겨우 3주(21일)밖에 안지났는데 하루 최소 12시간 이상 씩 매일 하다보니 체감상 3달은 된거 같습니다. 적은 일수로 많은 것을 해내기 위해 필요한 것들만 배울 수 있도록 커리큘럼이 짜여져 있어 항해 99가 끝난 후에 어떻게 되었을지 기대가 많이 됩니다.
  • 몰랐던 알고리즘(백트래킹, 분할정복, 다익스트라)을 적용해야만 풀 수 있는 문제도 있어 혼자 고민하면서 시간을 흘러보내며 결국 인터넷을 찾아봐서 알게되었지만 문제를 해결하려고 시도한 덕분에 알고리즘에 더욱 익숙해질 수 있었습니다.
  • 2주동안 배우고 연습했던 알고리즘으로 3/20 Startup Coding Festival을 지원해 시험을 봤습니다. 4시간동안 총 6문제를 풀면되는데, 6문제 중 2문제만 정답으로 처리되고 2문제는 예제만 통과해 많이 아쉬웠고, 열받았습니다. 알고리즘 공부를 나름 열심히 했다고 생각했는데 더욱 더 열심히 해야하는 생각이 들었습니다. (지속적으로 최소 하루에 2~3문제는 풀기)
  • 다음 커리큘럼(3/19) 부터 각자 선택한 주특기(Spring)에 대해 배우게 되는데, 이제 본격적으로 서비스를 만드는 준비를 하는거 같아 설렘을 느끼고있습니다.

반응형
728x90

(1) Deque(DoubleEndedQueue)란?

  • Deque(DoubleEndedQueue)는 앞,뒤 양방향 모두 데이터 처리가 가능한 자료구조이다.
  • 큐와 스택 기능을 모두 가지고있어 원하는대로 사용하면 된다.
  • Collections 내에 내장되어있어 import collections을 해줘야 사용이 가능하다.
  • 장점
    • Deque는 어느 방향에서나 거의 동일한 O(1) 성능으로 데크의 양쪽에서 스레드 안전, 메모리 효율적인 추가 및 팝을 지원한다.

(2) Deque Class 및 함수

class collections.deque([iterable[, maxlen]])
  • append(x) - 오른쪽에 x값 추가
  • appendleft(x) - 왼쪽에 x값 추가
  • clear() - 전체 요소 제거
  • copy() - deque 복사
  • count(x) - x와 같은 요소 갯수
  • extend(iterable) - 오른쪽에 반복가능한 인수의 요소를 추가
  • extendleft(iterable) - 왼쪽에 반복가능한 인수의 요소를 추가
  • index(x) - x의 위치를 반환
  • insert(i,x) - x를 i에 삽입
  • pop() - 오른쪽 요소를 제거하고 반환
  • popleft() - 왼쪽 요소를 제거하고 반환
  • remove(x) - 값이 x인 첫번째 항목을 제거
  • reverse() - 요소를 뒤집는다
  • rotate(n) - n만큼 요소들을 오른쪽으로 이동(맨오른쪽에있는요소는 맨왼쪽으로 이동)

(3) 사용법

from collections import deque

deque = deque()

deque.append('a')
print(deque)                #deque(['a'])

deque.appendleft('b')
print(deque)                #deque(['b', 'a'])

temp_deque = deque.copy()
print(temp_deque)           #deque(['b', 'a'])

deque.clear()
print(deque)                #deque([])

deque.extend(temp_deque)
print(deque)                #deque(['b', 'a'])

deque.append('c')
print(deque)                #deque(['b', 'a', 'c'])

deque.extendleft(temp_deque)
print(deque)                #deque(['a', 'b', 'b', 'a', 'c'])

print(deque.index('b'))     #1

deque.insert(3,'d')
print(deque)                #deque(['a', 'b', 'b', 'd', 'a', 'c'])

print(deque.pop())          #c
print(deque)                #deque(['a', 'b', 'b', 'd', 'a'])

print(deque.popleft())      #a
print(deque)                #deque(['b', 'b', 'd', 'a'])

deque.remove('d')           #deque(['b', 'b', 'a'])
print(deque)

deque.reverse()             #deque(['a', 'b', 'b'])
print(deque)

deque.rotate(1)             #deque(['b', 'a', 'b'])
print(deque)

참조 - docs.python.org/3/library/collections.html

반응형
728x90

(1) WIL(Weekly I Learned) - 2주차

  • 3/5일 이전 1주차가 끝남과 동시에 2주차 커리큘럼인 알고리즘이 시작되었습니다.
  • 1주차 동안 같이 프로젝트를 진행했던 팀원분들과는 헤어지고 랜덤으로 생성된 다른 팀으로 재조정 되었습니다.
  • 알고리즘에 대해 이해할 수 있는 문제들이 제시 되어 해당 요일들을 권장요일에 맞춰 문제를 푸는 형태이며, 별도의 수업은 없으며 사전지식이 없는 경우를 대비해 스파르타 코딩클럽에서 운영하고 있는 알고리즘, 파이썬 기본문법을 수강할 수 있도록 무료로 열어 주어 개개인의 실력차를 스스로 맞춰나갈 수 있도록 진행되었습니다. 
  • 3/5일 ~ 3/11일 까지 21문제가 제시 되었고, 각각 난이도는 하하 ~ 중상 까지 있었습니다.

(2) 일정

  • 3/5 ~ 3/11 - 권장요일에 맞는 문제풀이
  • 3/5 ~ 3/11 - 모르는 부분을 채우기 위한 동영상 강의 보기 (스스로 부족한 부분만 봐도 무방)
  • 3/10 (19:00 ~ 20:00) - 항해톡 진행 (항해99 크루원(참가자) 중 지원한 4명을 선정해 각각 RestAPI, https, 프로세스와 스레드, 시간복잡도 에 대한 설명)
  • 3/10 (20:00 ~ 21:00) - 튜터님의 <알고리즘을 대하는 자세> 특강

(3) 배운점

  • 성능
    • 시간복잡도
    • 공간복잡도
    • 점금표기법
  • 자료구조
    • 링크드 리스트
    • 트리
    • 그래프
  • 알고리즘
    • 이진탐색
    • 정렬
      1. 버블정렬
      2. 삽입정렬
      3. 병합정렬
    • 해쉬
    • DFS & BFS
    • DP(Dynamic Programming)

(4) 문제풀이

 


(5) 느낀점

  • 3/5 초반부 문제들은 사칙연산, 조건문, 반복문, 문자열 등 대체로 쉬운부분 이여서 무난하다 후반부분에서 익숙치 않은 알고리즘을 만나 시간을 많이 소모하기도 했습니다. 1주차에 비해 팀원분들과 소통하는 시간은 유일하게 풀었던 문제 코드리뷰, 또는 모르는 문제 물어보기 밖에 없어 개개인이 각자 문제 푸는 시간이 많고, 팀원들과의 속도가 맞지 않아 쉬는 시간을 더 많이 갖고, 집중력도 떨어져 열심히 안한것 같아 나 자신에게 실망했습니다. 
  • 그래도 후반부에 나오는 DFS/BFS, DP, 이분탐색 등 코딩 테스트에 자주 출제하는 알고리즘을 사용해야하는 문제들을 알려주고, 배우며 익숙해지고있어 만족스러웠습니다.

반응형
728x90

(1) WIL(Weekly I Learned) 시작

  • 3월 1일, 빨간날과 상관없이 항해 99가 시작되었습니다.
  • 공식적으론 아침 9시 ~ 저녁 9시까지 공부를 해야 한다고 나와있지만 부족한 점이 많기에 아침 9시 ~ 새벽(자기전) 까지 계속 진행되었습니다.
  • 항해 99를 시작 하기 전 웹 개발에 대해 지식을 조금이나마 채울 수 있도록 항해 99에선 웹 개발 종합반 수업을 열어 사전학습을 하도록 한 후 3월 1일 부터 바로 3명의 랜덤 팀원들과 미니 프로젝트를 진행하게 되었으며, 1주일 간 배운 것을 회고할 수 있도록 WIL을 추천하여 이 글을 쓰게 되었습니다.

(2) 일정

  • 3/1 ~ 3/4 - 팀 배정 및 웹 개발 미니 프로젝트
  • 3/5 - 3/1 ~ 3/4 동안 만들었던 미니 프로젝트 발표 및 팀 배정
  • 3/6 ~ 알고리즘 문제풀이

(3) 배운점


(4) 미니 프로젝트

 


(5) 느낀점

  • 팀 배정을 받은 후 3/4일 자정까지 부족한 시간으로 프로젝트를 진행하게 되었습니다. 공대생 3명으로 이루어진 팀이여서 그런지 프로젝트 완성 후에도 디자인이 너무 투박해 아쉬운 면도 있지만 팀원들과의 협업을 통해 하나의 프로젝트를 완성했다는 것이 만족스러웠습니다.
  • 프로젝트를 진행 하면서 JWT를 사용하라는 조건이 있어 JWT에 대해 자연스럽게 알게되었으며, 또 한번 사용해보게 되어 공부가 많이 되었습니다. 또한 조건에 없는 경우에도 프로젝트를 만들면서 필요한기능을 하나 둘 씩 생각하고 찾아보면서 몰랐던 부분을 새롭게 알게되었고, 혼자 아침 9 시부터 자기전 까지 계속 컴퓨터 앞에 앉아 공부하는 것이 쉽지만은 않은데 Gather을 통해 마이크, 웹캠을 키고 진행을 하게 되어 온라인이지만 오프라인에서 공부하는 느낌이 들어 팀원들과 힘을 내 매일매일 9시부터 자기전까지 개발을 할 수 있었습니다.
  • 3/5일 다른 팀 총 32개조의 미니 프로젝트를 보면서 여러 아이디어를 보며 사전학습에 배웠던 '크롤링'만으로 여러 가지를 할 수 있구나를 보며 신기했습니다.
  • 3/6일 부터 알고리즘 주차가 시작되었습니다. 항해 99 튜터 분들이 정해 놓은 문제를 하나 둘 씩 풀면서 푼 문제는 팀원들과 코드리뷰, 어려운 문제가 있는 경우 서로 도와주며 진행하고있으나, 아직 쉬운문제이기에 다음주에는 항해 99에서 열어준 알고리즘 수업을 듣고 문제를 푸는 방식으로 갈 예정입니다.

반응형

+ Recent posts