오늘 공부한 내용

  • 플러스주차 복습과제 작성, 제
  • 코드카타 2문제

 

 

 

 

오늘의 느낀점

 오늘까지 플러스주차 복습과제를 작성하고 제출했다.
이번에는 내스스로 과제를 어느정도 완료하고 제출했다는것에대해 큰의미를 가진다.
어느덧 스파르타 시작한지 2달이 넘어서게 되었다.
처음 스프링을 시작했을때 CRUD에서 api 조차 모르고 postman, github까지 짧은시간동안 개발자로서 필요한것에 대해 무엇인지 많이 알게 되었다.
특히 내 스스로 공부했었다면 반년이 되어도 이수준까지 올라오는거는 힘들지 않았을까 싶다.
끝나는 날까지 열심히 해보자.

오늘 공부한 내용

  • 플러스주차 복습과제 작성
  • 베이직 보충 수업 / 로그인 기능 구현
  • 코드카타 2문제

 

오늘의 느낀점

 이번 복습과제를 하면서 이전에 비해 확실히 CRUD작성시 스스로 작성하고 내가 어디가 문제인지를 파악할수 잇게 되었다.

다만 새로운것에 대해서 좀더 더 많이 찾고 알아야 하는데 복습위주로 로 공부를 하면서 반복 숙달을 위해 과제 중심으로 하다보니 실력이 늘어나기 보다는 오히려 막혀서 성장을 못하고 있는거 아닌가라는 생각이 든다..

 

 

오늘 공부한 내용

  • Spring 심화 영상 시청
  • 베이직 보충 수업 / JWT, Security
  • 코드카타 2문제

 

어려웠던 내용

  •  JWT 와 Security에 대한 구동방식은 이제 이해가 가는거 가지만 이를 crud에 접목해서 하려고하니 응용하는 어떻게 다가설지 모르겠다.

 

 

 

오늘의 느낀점

 오늘 보충 수업을 들으면서 JWT가 어떻게 작동하고 그에 따라 필터를 통해 인증, 인가가 어떻게 이루어지는지 제대로 이해 할수 있었다.
다만 이제 이를 이용해 숙제로 내준 CRUD중 create 부분을 작성해 로그인 까지 구현 하려고 했는데 작성까지는 왔다만 뭔가 잘 안되는거 같다.
CRUD로 회원가입, 로그인, 포스트 목록등 이제 혼자서 만들수 있는데 이를 security에 적용하려고 하니 막막한데 지래 겁먹게 되는거 같다.
개발자가 적는것에 따라 구조가 조금씩 바뀌다 보니 외울려 해도 듀터님은 외우는게 아닌 구조를 이해하라고 하셨는데 좀만더 하면 이제 완전히 할거 같은데좀 답답하다...

오늘 공부한 내용

  • 스프링 심화주차 재시청
  • 코드카타 2문제

 

새로 알게된점

AWS ( Amazon Web Services)

AWS는 일전에 배웠던 Kakao Developers와 비슷한 개발자를 위한 오픈소스 이며 전 세계적으로 분포한 데이터 센터에서 200개가 넘는 완벽한 기능의 서비스를 제공하는, 세계적으로 가장 포괄적이며, 널리 채택되고 있는 클라우드이다. 

 

AWS의 주요 서비스는 다음과 같다.

  • 컴퓨팅: EC2 (Elastic Compute Cloud), Elastic Beanstalk 등
  • 데이터베이스: RDS (Relational Database Service) 등
  • 스토리지: S3 (Simple Storage Service), EBS (Elastic Block Store)등
  • 네트워킹: VPC (Virtual Private Cloud), CloudFront, Route 53 등
  • 보안: IAM (Identity and Access Management)

 

이러한 AWS의 장점과 단점으로는

AWS 의 장점

  • 확장성 : 광범위한 컴퓨팅 리소스에 대한 온디맨드 액세스를 제공하므로 기업이 필요에 따라 IT 인프라를 쉽게 확장
  • 비용 효율성 : AWS 고객은 사용한 리소스에 대해서만 비용을 지불하므로 선불 비용이나 장기 약정 없이 비용 효율적인 솔루션을 제공합니다.
  • 안정성 : 매우 안전하고 안정적인 데이터 센터의 글로벌 네트워크를 운영하여 고가용성 및 재해 복구 기능을 제공
  • 유연성 : 컴퓨팅, 스토리지, 데이터베이스 및 분석을 포함한 광범위한 서비스를 제공, 고객이 다양한 애플리케이션과 서비스를 구축하고 실행
  • 혁신 : 연구 개발에 막대한 투자를 하여 정기적으로 새롭고 혁신적인 서비스와 기능을 출시하고 고객에게 최신 기술에 대한 액세스를 제공
  • 보안 : 고객 데이터를 보호하고 관련 규정을 준수할 수 있도록 다양한 보안 조치 및 인증을 구현
  • 글로벌 도달 범위 : 여러 지리적 지역에 위치한 데이터 센터를 통해 AWS 를 통해 고객은 데이터를 고객과 더 가까운 위치에 저장하여 성능을 개선하고 대기 시간을 줄일 수 있다.

AWS 의 단점

  • 복잡성 : 클라우드 컴퓨팅을 처음 접하는 조직의 경우 관리 및 탐색이 복잡할 수 있는 광범위한 서비스 및 기능을 제공
  • 비용 : 비용 효율적인 솔루션을 제공하지만 사용량이 많거나 특수한 요구 사항이 있는 비즈니스에는 요금 모델이 비쌈
  • 인터넷 의존성 : 안정적이고 빠른 인터넷 연결에 의존하며 모든 중단은 서비스의 성능과 가용성에 영향을 미침
  • 공급업체 종속 : 기업이 AWS 에 투자한 후에는 다른 공급업체로 전환하는 것이 어렵고 비용이 많이 들기 때문에 공급업체 종속이 발생
  • 보안 문제 : 다양한 보안 조치를 구현하지만 클라우드에 중요한 데이터를 저장하는 것과 관련된 보안 위험과 우려가 여전히 존재
  • 통제력 부족 : AWS 고객은 기본 인프라와 서비스를 관리하고 유지하기 위해 Amazon 을 신뢰해야 하며, 이로 인해 IT 리소스에 대한 통제력과 가시성이 줄어들 수 있다.

 

느낀점

이전에 배웠던 오픈소스중 Kakao Developers와는 다르게 더욱더 많은 기능을 가지고 있어서 영상을 보면서도 잘 와닿이 않았다.

실제로 현업에 가면 다양한 오픈소스를 이용하여 작업을 실시 할것이고 듀터님 말씀으로는 이를 다 암기하는 사람은 없으며 대부분 가져와서 적용하는 것이라고 하는데 정말 공부하면 할수록 편한것들이 많아지는 반면 이에따라 점점 복잡하고 다양한 기능이 생겨나니 정말 끊임없이 배워야 할거 같다.

오늘 공부한 내용

  • 스프링 숙련주차 재시청
  • 코드카타 문제 토의
  • 코드카타 2문제

 

새로 알게된점

* replace 메서드, replaceAll 메서드

코드카타 문제 푸는 도중 새로운 메서드를 알게 되었다.

 

replace 메서드  문자열의 특정 문자를 지정 문자로 대체 후, 문자열 반환하는 메서드이다

작성시 replace(찾을문자열, 바꿀문자열) 형태로 파라미터 안에 내용을 적어주면 되는데

예시로

class pratice{
    public static void main(String[] args){
        String str = "I have a pen. I have an apple.";
        str = str.replace("I", "You"); 
        System.out.println(str);  // You have a pen. You have an apple.
    }
}

적으면 "I"에 해당하는 글자를 "You" 로 바꾸어서 출력한다.

 

replaceAll 메서드 는 replace 메서드 와 동일하게 작동한다.

사실 replace 부분을 replaceAll 로 바꾸어도 상관은 없다.

다만 차이점이 무엇이나면 둘이 들어가는 인자값이 다르게 적용이 된다.

 

String replace (CharSequnce target, CharSequence replacement)

String replaceAll (String regex, String replacement)

 

위 처럼 replace는 인자값이 CharSequnc 형태로, replaceAll 인자값은 String 으로 적용되는데 여기서

replaceAll 경우 첫번재 값이 regex 라는 정규식 형태로 값이 들어가게 된다.

정규식으로 처리한다면 불특정 문자열을 변환할수 있는 장점이 있습니다.

 

예시 로

class pratice{
    public static void main(String[] args){
        String str = "aaabbbccccabcddddabcdeeee";
  
  		String result1 = str.replace("abc", "왕");
  		String result2 = str.replaceAll("[abc]", "왕");
  
  		System.out.println("replace result->"+ result1);
  		System.out.println("replaceAll result->"+ result2);
    }		
}

// replace    result -> aaabbbcccc왕dddd왕deeee
// replaceAll result -> 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee

이런 형식으로 replace 메서드는 정해진 값만 일부 변강하게된다

여기서 [abc]는  정규식 표현으로 [abc]는 []안에 있는 문자들을 전부 왕으로 변환시켜준다.

즉 a , b , c 3가지의 문자를 만나면 전부 치환대상이 되는것이다.

 

여기서 만약 replace를 정규식을 사용하지 않고 replaceAll 와 같은 동일한 값을 얻고 싶다면

class prac{
    public static void main(String[] args){
        String str = "aaabbbccccabcddddabcdeeee";
  
  		String result1 = str.replace("a", "왕").replace("b", "왕").replace("c", "왕");
  		String result2 = str.replaceAll("[abc]", "왕");
  
  		System.out.println("replace result->"+ result1);
  		System.out.println("replaceAll result->"+ result2);
    }		
}

// replace result    -> 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee
// replaceAll result -> 왕왕왕왕왕왕왕왕왕왕왕왕왕dddd왕왕왕deeee

위처럼 replace에 들어가는 인자값을 하나하나 일일히 적어주어야만 적용이 되게 된다.

 

 

느낀점

코드 카타를 점점 하다보면 정말 사람들이 이렇게 하면 적용할수 있구나 싶을정도로 다양한 방법이 나온다.

지금은 문제를 해결하기 보다는 작성하기위하여 다양한 메서드를 익혀놓아야 추후에 문제를 풀시 다양한 접근방법으로 적용하여 풀수있도록 반복 암기하 중요할거 같다. 

   

오늘 공부한 내용

  • 스프링 숙련주차 재시청
  • 코드카타 2문제

 

새로 알게된점

* Math.max, Math.min 메서드

Math.max 함수는 숫자 집합중에 가장 큰 수를 리턴하는 함수이며, 

Math.min 함수는 숫자 집합중에서 가장 작은 수를 리턴하는 함수이다.

 

 

 

 

Math.max(파라미터 1, 파라미터 2)

 : 인자1과 인자2 중 큰 값을 리턴 

 

Math.min(파라미터 1,파라미터 2)

 : 인자1과 인자2 중 작은 값을  리턴 

 

파라미터에는 int, double, float 등 다양한 타입을 넣어 비교 가능하다

 

class Compare{
	public static void main(String args[]) {
    	
		Math.max(3.14,5.18); -> 5.18 

		Math.min(33,77) -> 33 
        
   	}
}

오늘 공부한 내용

  • 베이직반 보충수업 / CRUD 작성 복습
  • 코드카타 2문제
  • 스프링 입문 영상 재시청

 

새로 알게된점

 

* SOLID (객체 지향 설계)

SOLID 원칙이란 로버트 마틴이 소개한 객체 지향 프로그래밍 및 설계의 5가지 기본 원칙을 말하며, 5가지의 원칙의 앞 글자를 따서 “SOLID”라고 부른다.

  1. SRP (Single Responsibility Principle) : 단일 책임 원칙
  2. OCP (Open/Closed Principle) : 개방/폐쇄 원칙
  3. LSP (Liskov Substitution Principle) : 리스코프 치환 원칙
  4. ISP (Interface Segregation Principle) : 인터페이스 분리 원칙
  5. DIP (Dependacny Inversion Principle) : 의존관계 역전 원칙

 

  • 단일 책임 원칙

하나의 객체는 반드시 하나의 기능만을 수행하는 책임을 갖는다는 원칙이다.

이는 클래스를 변경하는 이유는 오직 하나뿐이어야 한다는 것과 같은 의미를 말한다.

객체가 담당하는 동작, 즉 책임이 많아질 수록 그 객체의 변경에 따른 영향도의 양과 범위가 매우 되는데

SRP를 코드에 적용하면, 책임 영역이 확실해져 한 책임의 변경에서 다른 책임의 변경의 연쇄작용에서 자유로워 지며

즉, 코드의 의존성과 결합도를 줄이게 된다.

단일 책임 원칙은 특정 객체의 책임 의존성 과중을 지양하기 위한 중요하고 기본적인 원칙입니다.

 

SRP를 위반한 코드

다음의 코드는 단일 책임 원칙을 위반하고 있다.

public class Animal {

    private String animal;

    public void setAnimal(String animal) {
        this.animal = animal;
    }

    public void cry () {

        if(animal == "Dog") { // 강아지
            System.out.println("bark!");
        }
        else if(animal == "Cat") { // 고양이
            System.out.println("meow..");
        }
    }

}

다음의 Animal 클래스에서는 동물의 울음소리를 출력하는 cry() 메서드를 구현하고 있다. cry() 메서드는 Animal의 값이 "Cat"이면 고양이 울음소리를, "Dog"면 강아지 울음 소리를 출력하는데 즉, 두 기능이 분리되어 있지 않고 하나의 메서드가 두 기능을 모두 가지고 있으므로 단일 책임 원칙을 위반하고 있다.


SRP를 적용한 코드

다음 코드에서는 단일 책임 원칙 위반 문제를 해결하기 위해 추상 클래스를 만들어 각각의 하위 클래스에서 메서드를 상속 받아 사용하고 있다.

abstract class Animal {
    abstract void cry();
}

class Dog extends Animal {
    @Override
    void cry() {
        System.out.println("bark!!!");
    }
}

class Cat extends Animal {
    @Override
    void cry() {
        System.out.println("Meow...");
    }
}

위의 코드에서는 공통기능인 추상 메서드 cry()를 가진 추상 클래스 Animal을 만든 것이다.

그리고 각각의 Dog, Cat 클래스를 만들어 Animal을 상속 받아 각자의 클래스에 자신의 울음소리만을 구현한다.

즉, 하나의 클래스에 하나의 기능을 가지고 있게 되는것 이다.


⭕️ 정리! 단일 책임 원칙 (SRP)

작성된 클래스는 하나의 기능만을 가지며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다.

 

 

프로젝트명 : 팔팔잇츠

팔팔한 상태로 발 빠른 배송, 팔팔잇츠!

  • 팀명 : 아직팔팔하조?
  • 팀원 : 조원호(팀장), 이지선, 김종규, 김대영
  • 개발 기간 : 2023.12.05 ~ 2023.12.10
  • 개발 내용 : 팀원 소개 사이트 만들기 

깃허브 : https://github.com/palpalTeam/Palpal-Eats

 

GitHub - palpalTeam/Palpal-Eats

Contribute to palpalTeam/Palpal-Eats development by creating an account on GitHub.

github.com

UI / UX

 

ERD

1. KEEP

  • Code With Me
    • 인텔리제이 를 통해 공통적인 작업을 다 같이 처리하는 과정이 좋았습니다.
  • 기록
    • 정기적인 회의와 빠른 피드백을 적용하면서 이에대한 변경사항, 이유 등을 상세히 기록했습니다.
    • 질문, 수정 사항에 대해서는 일일 회고록을 작성했습니다.
  • API 명세 작성 전 와이어 프레임 선 작성
    • 와이어 프레임을 작성후 API를 작성함으로써 프로젝트 목표 달성에 있어서 착오없이 이루어질수 있었습니다.
  • PostMan
    • PostMan을 이용하여 API 예시 유형별 (성공,실패) 로 꼼꼼히 작성해서 저장했습니다.
    • 이에 시연 영상 제작, 프로그램 테스트할때 큰 도움이 됬습니다.

 

2. PROBLEM

  • Git 사용법이 미숙했습니다.
  • 데일리 스크럼 작성을 꾸준히 작성하지 않았습니다.
  • 스프링에 대한 낮은 이해도로 인해 코드작성히 동료들의 도움을 많이 받았습니다. 

3. TRY

 

 

Learn Git Branching

An interactive Git visualization tool to educate and challenge!

learngitbranching.js.org

 

  • 데일리스크럼을 꾸준히 작성해서 자신의 일정을 팀원과 공유합니다.
  • 프로젝트간 사용된 모르는 기술에 대해 따로 기록해놓고 숙지 할수 있도록 합니다.
  • 코드 공부를 더욱 열심히하여 스스로 코드를 짤 수 이도록 노력합니다.
  •  

 

느낀 점

이번 프로젝트를 하면서 동료분들에게 정말 많은 도움을 받았고 배움을 얻었습니다.

프로젝트를 할때 어떤 방식으로 할지 또 어떤 방법으로 구상하는지 에대한 생각과 작성시 원할한 도움을 줄수 있는 인텔리제이 Code With Me 기능, Git Push와 Pull 오류발생시 Git stash 를 이용하여 해결 하는 방법 외에 자잘한 팁들 까지 정말 이번프로젝트는 여태까지 한 작업중 저에게 가장 많은 배움을 주었던거 같습니다.

프로젝트를 완료하기위해 밤늦게까지 주말임에도 불구하고 서로 도와주고 확인하며 Test까지 완료하는 팀원 모습들을 보면서 이번에는 정말 좋은 분들을 만났다고 생각했습니다.

이번에 얻은 배움을 바탕으로 더욱더 노력해 팀원분들처럼 남들에게 알려주도 도움되는 개발자가 되도록 노력하고자 합니다.

 

 

오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • isDeleted 기능

프로젝트 구상중 팀원이 낸 의문점으로 가게나 메뉴가 사라졌을 경우 나중에 사업자가 정산을 받거나 세금 정리등 이전 자료를 필요로 할때 주문이나 리뷰 같은 과거의 정보는 남아 있어야 확인이 가능하지 않냐는 의문을 제시 했다.

 

이에 엔티티에 Boolean 타입으로 isDeleted 필드를 추가 하는것으로 해결 가능하다

조회를 할 때도 isDeleted true만 제외하고 조회를 하면 된다고 하는데 자세한 내용을 좀더 찾아 보아야 할거 같다

오늘 공부한 내용

  • Spring 백오피스 프로젝트 / 리뷰 CRUD 만들기
  • 베이직 클래스 보충수업 / 데이터 베이스 실습
  • 코드카타 2문제

 

어려웠던 내용

  •  프로젝트 API 구상

 

새로 알게된점

  • Entity 매핑, @어노테이션 구분

1. @Entity 

@Entity 어노테이션은 JPA를 사용해 테이블과 매핑할 클래스에 붙여주는 어노테이션이다. 이 어노테이션을 붙임으로써 JPA가 해당 클래스를 관리하게 된다.

속성 기능
name JPA에서 사용할 엔티티 이름 지정
name을 쓰지 않을 경우 (default) 클래스이름을 엔티티 이름으로 지정

아래의 코드 결과를 보면 name = "user2"로 함으로써 user2 테이블이 생성된 것을 볼 수 있다.

@Entity(name = "user2")
public class User {}

테이블 생

2. @Table

@Table은 엔티티와 매핑할 테이블을 지정

속성 기능
name 매핑할 테이블 이름
생략시 엔티티 이름(@Entity(name="~") 사용
catalog catalog 기능이 있는 DB에서 catalog 매핑
schema schema기능이 있는 DB에서 schema 매핑
uniqueContraints DDL 생성시 유니크 제약조건 생성
 스키마 자동 생성 기능을 사용해 DDL을 만들 때만 사용

아래 코드 결과를 보면 @Table에 name을 추가하면 테이블이름이 name값으로 설정이 되고 생략시 Entity이름으로 테이블이 만들어지는 것을 확인할 수 있다.

@Entity
@Table(name = "user3")
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

user3 명칭으로 테이블 생성

@Entity(name="user2")
@Table
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

user2 명칭으로 테이블 생성

 

3. @Id

@Id는 특정 속성을 기본키로 설정하는 어노테이션이다.

@Entity
@Table(name = "User")
public class User {
    @Id
    private Long id;
    private String name;
}

@Id 어노테이션만 적게될 경우 기본키값을 직접 부여해줘야 한다.

하지만 보통 DB를 설계할 때는 기본키는 직접 부여하지 않고 Mysql AUTO_INCREMENT처럼 자동 부여되게끔 한다.

@Entity(name="user2")
@Table
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

@GeneratedValue 어노테이션을 사용하면 기본값을 DB에서 자동으로 생성하는 전략을 사용 할 수 있다.

전략에는 IDENEITY, SEQUENCE, TABLE 3가지가 있다.

속성 기능
@GeneratedValue(startegy = GenerationType.IDENTITY) 기본 키 생성을 DB에 위임 (Mysql)
@GeneratedValue(startegy = GenerationType.SEQUENCE) DB시퀀스를 사용해서 기본 키 할당 (ORACLE)
@GeneratedValue(startegy = GenerationType.TABLE) 키 생성 테이블 사용 (모든 DB 사용 가능)
@GeneratedValue(startegy = GenerationType.AUTO) 선택된 DB에 따라 자동으로 전략 선택

위 처럼 다양한 전략이 있는 이유는 DB마다 지원하는 방식이 다르기 때문이다.

AUTO 같은 경우DB에 따라 전략을 JPA가 자동으로 선택한다. 이로 인해 DB를 변경해도 코드를 수정할 필요 없다는 장점이 있다.

 

4. @Column

@Column은 객체 필드를 테이블 컬럼과 매핑한다.

@Column
private String name;
속성 기능
name 필드와 매핑할 테이블의 컬럼 이름 지정
default는 필드이름으로 대체
insertable true : 엔티티 저장시 필드값 저장
false : 필드값이 저장되지 않음
updatable true : 엔티티 수정시 값이 수정
false : 엔티티 수정시 값이 수정 되지 않음
table 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용
nullable  null값 허용 여부 설정
false : not null 제약 조건
unique 컬럼에 유니크 제약조건 부여
columnDefinition 데이터베이스 컬럼 정보를 직접 부여
length 문자 길이 제약조건
String 타입일 때 사용
precision, scale BigDecimal 타입에서 사용
precision : 소수점을 포함한 전체 자릿수 설정
scale : 소수의 자릿수

 

 

오늘의 느낀점

오늘 베이직 수업을 들으면서 @Entity 구성에 많이 사용되는 Jpa 어노테이션을 재복습 하는 시간을 가졌다.
해당 어노테이션이 자세하게 파고 들지은 않아서 어떤 역할을 하는지  대충 알고있는 형태로만 알고 있었는데 이번 프로젝트를 하면서 어노테이션에 대해서 세부적으로 기본개념에대한 설명을 읽으면서 알아보니 좀더 잘이해가되어 앞으로도 적용하는데 도움이 될거 같다.

 

+ Recent posts