• 기간 10월 21일(금)~10월 28일(목)
  • 프론트 랑 첫 협업

1. 미니 프로젝트

주특기 숙련 주차에는 백엔드 끼리 협업을 하는 방법을 경험해봤다면 미니 프로젝트 주차는 백엔드 끼리 협업 뿐만 아니라 프론트 엔드와도 협업을 해볼 수 있는 기간이었다.
프론트와 백은 한 주동안 어떠한 주제에 대해서 프로젝트를 진행할 지 얘기하였고 우리 조는 벨런스게임을 만들기로 했다.

협업을 진행하면서 어려웠던 점

  • 아무래도 프론트와 백 모두 협업을 처음 진행하다 보니 프론트와 백의 역할 경계가 애매했던 것 같다.
    -> 아이디, 비밀번호 등의 유효성 또는 예외처리 같은 것들을 어디서 처리해야 하나 고민을 했지만 안전성을 위해 프론트와 백 모두 진행하였다.

  • 도커로 깃액션을 사용한 자동 배포를 해보았다. 아주 잘 되었다.
  • 무료 SSL 인증서 발급이 생각보다 많이 어려웠다. 기존의 백에서 배포를 했을 때는 HTTP로 배포를 했지만 프론트 분들은 HTTPS로 배포를하여 맞춰줄 필요가 있었다. 이를 위해 SSL 인증서를 발급받아 스프링부트에 적용을 해야했다. 처음은 Certbot으로 진행하였지만 잘 되지 않아 무료 인증서를 발급해주는 사이트를 통해 SSL 인증서를 발급받을 수 있었다.

이번 협업을 통해 중요하다고 느낀점

이번 협업을 통해 처음 API 설계에 중요성에 대해 느꼈다. 항상 미니 프로젝트 전까지는 API 명세서에 작성할 때 간단하게 적어놓고 Postman이나 Swagger를 통해 API 명세서를 만들곤 했다.
하지만 프론트와 협업을 진행할 때 처음부터 API 설계를 할 때에 해당 API의 url 어떤 것을 request할지, 이에 대해 어떤 내용을 response할지 명확히 정해두지 않으면 백은 해당 API에서 request 받기를 원하는 데이터를 제대로 받지 못해 null이 떴고 프론트도 마찬가지로 데이터를 제대로 화면에 띄어줄 수 없는 상황이 발생하였다.

또한 API 설계 명세서에 최신화의 중요성을 깨달았다. 주고받는 데이터가 바뀌거나 url에 변경이 생기는 등 무언가 수정사항이 있을 때 제때제때 설계 명세서에 반영해놓지 않으면 프론트와 백 모두 혼선을 야기할 수 있다. 따라서 무언가 API 설계 명세서에 대해 변경점이 생기면 변경점에 대해 수정을 해놓고 서로에게 어디에서 이러한 변경점이 생겼다 ~~ 얘기해주는 것이 좋을 것 같다.

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 8주차 WIL  (0) 2022.11.14
항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 99 주차 4WIL  (0) 2022.10.16
항해 99(9기) 3주차 WTL 회고  (0) 2022.10.09
항해 99(9기) 2주차 회고  (0) 2022.10.02
  • 기간 10월 07일(금)~10월 13일(목)
  • 스프링 ORM, SQL, MVC

feat…… 카카오 서버실 화재로 인해 서버가 불안정해 계속 사용해오던 티스토리를 사용하지 요번에는 노션으로 작성해봤다……..

ORM 이란?

ORM 이란 Object-Relational Mapping 의 약자로, 이름 그대로 객체(Object)와 관계형 데이터(Relational data) 를 매핑하기 위한 기술이다. 이러한 매핑이 필요한 이유는 객체 지향 언어과 관계형 데이터베이스사이의 패러다임 불일치가 있기때문이다.  이 둘 간의 패러다임 불일치 때문에 개발자는 더 많은 코드를 작성해야 하며, 이는 반복적이고 실수하기 쉬운 작업이 된다. 그렇기 때문에 개발자는 객체지향적인 설계에 집중할 수 없게 된다. ORM이 바로 이러한 문제를 해결해 준다.

https://medium.com/@emccul13/object-relational-mapping-9d84807f5536

🌱 패러다임 불일치

객체 지향 프로그래밍과 관계형 데이터베이스 사이의 데이터 표현 방식이 달라서 생기는 문제를 패러다임 불일치라고 한다. 패러다임 불일치가 일어나는 이유는 애초에 이들의 목표와 동작 방식이 다르기 때문이다.

  • 객체 지향
    • 필드와 메서드 등을 묶어서 객체로 잘 만들어 사용하는 것이 목표
    • 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
  • 관계형 데이터베이스
    • 데이터를 잘 정규화해서 보관하는 것이 목표

🌱 JPA

JPA는 Java Persistence API의 약자로, 자바 ORM 기술에 대한 API 표준 명세이다. 즉, 인터페이스의 모음이다. 이러한 JPA 인터페이스를 구현한 대표적인 프레임워크가 하이버네이트(Hibernate)이다.JPA는 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓸 필요가 없다.

🌱 Hibernate

JPA를 구현한 프레임워크 중 사실상 표준이다. 오픈소스 소프트웨어이다. 여기서 주목해야할 점은 JPA는 기술 스펙이고 하이버네이트는 이 기능을 구현하여 공급해주는 역할이다.

🌱 Spring Data JPA

Spring framework에서 **JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트(모듈)**이다. Spring Data JPA의 목적은 JPA를 사용할 때 필수적으로 생성해야하나, 예상가능하고 반복적인 코드들을 대신 작성해줘서 코드를 줄여주는 것이다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.

Spring Data JPA는 JPA Provider이 아니다. 단지 데이터 계층에 접근하기 위해 필요한 뻔한 코드들의 사용을 줄여주도록 하는 인터페이스이다. 여기서 반드시 기억해야할 점은 Spring Data JPA는 항상 하이버네이트와 같은 JPA provider가 필요하다는 것이다.

SQL이란

SQL은 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리 및 처리하기 위해 설계된 특수 목적의 프로그래밍 언어이며 질의(Query) 언어라고 불리기도 한다. 관계형 데이터 베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터 베이스 객체 접근 조정 관리를 위해 고안되었다. MySQL, MariaDB, MSSQL, 오라클 등의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다.

SQL 명령어

  • DDL(Data Definition Language, 데이터 정의 언어)

: DDL은 데이터베이스 스키마와 설명을 처리하도록 정의하는 언어이다. 데이터베이스나 테이블 생성/변경/삭제 등의 작업이 포함된다.

  • CREATE(데이터베이스 개체(테이블, 인덱스, 제약조건 등)의 정의
  • DROP(데이터베이스 개체 삭제)
  • ALTER(데이터베이스 개체 정의 변경)
  • DML(Data Manipulation Language, 데이터 조작 언어)

: 데이터 검색, 삽입, 변경, 삭제 수행을 조작하는 언어이다. 실질적으로 저장된 데이터를 관리하고 처리할 때 사용한다.

  • SELECT(테이블 데이터의 검색 결과 집합의 취득)
  • INSERT(행 데이터 또는 테이블 데이터의 삽입)
  • DELETE(데이터의 삭제)
  • UPDATE(표 업데이트)
  • DCL(Data Control Language, 데이터 제어 언어)

: 사용자 관리 및 사용자별로 릴레이션 또는 데이터를 관리하고 접근하는 권한을 다루기 위한 언어이다.

  • COMMIT : 트랜잭션의 작업 결과를 반영
  • ROLLBACK : 트랜잭션의 작업을 취소 및 원래대로 복구
  • GRANT : 사용자에게 권한 부여
  • REVOKE : 사용자 권한 취소

MVC

소프트웨어 디자인 패턴 중 하나M (Model) / V (view) / C (Controller)

Model : 어플리케이션 정보, 데이터, DB 등 이다.View : 사용자에게 보여지는 화면, UI를 말한다,모델로부터 정보를 얻고 표시한다.Controller : 데이터와 비즈니스 로직사이 상호동작을 관리한다.모델과 뷰를 통제하며, MVC패턴에서 View와 Model이 직접적인 소통을 하지않도록 관리한다.

MVC 1

JSP -> View, Controller 모두 담당하나의 JSP로 유저 요청, 응답 처리 (구현의 난이도는 쉽다)

단순한 작은규모의 프로젝트에는 이 방법이 빠르고 쉽지만,큰 프로젝트에서는 확실히 나눠주는 게 좋다.JSP 하나에서 MVC가 모두 이루어지게되면 재사용성이 떨어지고,읽기도 힘들다. = 유지보수가 힘들다.

그래서 주소요청, 화면구현 따로따로 하기위해 MVC가 나온것이다.

  • 컴포넌트 기반으로 필요한 요소들을 묶어 놓았다!(* 자바를 사용해서 웹을 만들기 위한 기술이 핵심)

컴포넌트

재사용이 가능한 최소단위, 독립적인 소프트웨어 모듈 (교체가능한 부품)컴포넌트는 인터페이스를 통해서만 접근이 가능하다.컴포넌트 내 정보는 외부로부터 모두 숨겨진다. (정보 은닉)

📌 MVC 2

요청을 하나의 컨트롤러(Servlet)가 먼저 받는다.MVC 1과 다르게 역할이 분리되어있으며, M,V,C 중 수정할 부분이 생기면 그것만 꺼내어 수정하면된다. = 유지보수에 있어 장점이 있다.

spring MVC 패턴

스프링에서는 유저의 요청을 받는 DispathcerServlet이 핵심이다.이것이 Front Controller의 역할을 맡는다.Front Controller -> 우선 먼저 유저(클라이언트)의 모든 요청을 받고, 그 요청을 분석하여 세부 컨트롤러들에게 필요한 작업을 나눠주게 된다.

  1. 요청브라우저 특정 URL에 요청을 DispathcerServlet이 받는다.
  2. 요청에 매핑되는 컨트롤러를 검색요청
  • DispathcerServlet이 URI를 보고 controller를 식별하기위해핸들러 매핑과 통신한다.
  • 핸들러 매핑은 요청을 처리하는 특정 핸들러메서드를 반환(return)한다.
  1. 컨트롤러에 처리요청
  • DispathcerServlet은 특정 핸들러 메서드를 호출한다.(public String 특정메서드 (Model model)호출)
  • 핸들러 메서드는 모델과 뷰를 반환(return)한다.(public String 특정메서드 (Model model) {return "view";})
  1. 컨트롤러의 처리결과를 생성할 뷰를 결정한다.
  • DispathcerServlet은 논리적 뷰를 결정하는 뷰 리졸버를 찾아 호출한다. -> 논리적 뷰 이름을 입력한다.
  • 뷰 리졸버는 논리적 뷰 이름 -> 물리적 뷰 이름에 매핑하는 로직을 실행한다. (/template/view.html 으로 변환)
  • 예를들어,return "/hongView"; 를 아래와 같이 변경한다.src/main/resources/template/+return(논리이름)+.html
  • DispathcerServlet은 뷰를 요청해 실행한다.> 뷰에서 model 객체를 사용할 수 있게 한다.
  • DispathcerServlet은 응답을 다시 브라우저로 보낸다.> 결과화면 return

Servlet?

java언어로 웹을 구현하는 기술이며,클라이언트의 요청에 제일 먼저 반응한다.(주소요청을 받고 응답해주는 역할이다.)

ex) 브라우저에서 사용자가 입력하고, 전송하면 다시 결과값을 돌려주는데 여기가 서블릿이라 생각하면된다.

MVC 에서는 model(비즈니스로직), view(화면), controller(주소분기) 중 controller의 역할을 담당한다.

배운것

스프링 부트의 숙련 과정 강의를 보면서 Spring Security 와 JWT의 사용과정을 배웠다.

스프링 부트 공부를 시작하고 처음으로 긴코드(엄청 길지는…)를 다뤄보는 계기가 되었고.

MVC패턴의 구조를 여러가지로 짜보면서 익숙해지는 것 같았다. 그리고 JPA의 연관관계 영속성 등 을 더 알수 있게 되었다.

아쉬운점/느낀점

처음으로 스프링 부트의 SECURITY와 SECURITY의 필터를 중간에서 가로채서 JWT를 적용해 로그인 세션을 사용하지 않는 토큰을 사용하는 방법을 배웠다. 처음에는 그 과정을 이해하려고 노력을 많이 했고 그 과정에서 시간이 많이 들었다. 영상도 찾아보고 많은 문서들을 보면서 JWT를 구현 했지만

많은 부분들이 어렵게 느껴졌다. 웹페이지를 만드는 과정에서 가장 중요시 해야 할 보안 기능과 인증 인가기능 을 구현하면서 보안이 중요하다는 것을 느꼈고. 보안에 대해서 여러가지 찾아보면서 보안의 중요성을 더 알 수 있는 시간이였다.

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 (9기) 6주차 WLI 회고  (0) 2022.10.30
항해 99(9기) 3주차 WTL 회고  (0) 2022.10.09
항해 99(9기) 2주차 회고  (0) 2022.10.02
항해 99 (9기) 1주차 회고  (1) 2022.09.25
  • 기간 9월 30일(금)~10월 06일(목)
  • 스프링 기본 문법 및 기본적인 API 설계

 

DI 란?

의존성 주입(Dependency Injection, DI)

  • 설정 파일(XML)이나 어노테이션을 통해 객체 간 의존 관계를 설정하여, 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
  • 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되어 있기 때문에, 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며, 모듈간의 결합도도 낮출 수 있다.계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.
  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

        - 이일민, 토비의 스프링 3.1, 에이콘(2012), p114

DI 장점!

1. 의존성이 줄어든다.

앞서 설명했듯이, 의존한다는 것은 그 의존대상의 변화에 취약하다는 것이다.(대상이 변화하였을 때, 이에 맞게 수정해야함) DI로 구현하게 되었을 때, 주입받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어들게됨.

2. 재사용성이 높은 코드가 된다.

 있다.

3. 테스트하기 좋은 코드가 된다.

4. 가독성이 높아진다.

 

IOC란?

제어 역전(Inversion of Control, IoC)

  • 기존에는 객체의 의존관계를 개발자가 직접 처리해 주곤 했다. 하지만 스프링에서는 객체 생성과 의존 관계를 자바코드로 직접 처리하는 것이 아니라 컨테이너가 라이프사이클, 클래스 등을 직접 처리한다. 즉, 개발자가 직접 제어하는 부분을 프레임워크가 대신 제어하게 되어 제어권을 가지게 되었다. 그래서 제어의 역전이라고 한다.
  • 스프링에서는  '오브젝트' '빈(Bean)'이라고 칭한다.
  • @Autowired 어노테이션을 사용함으로써 개발자가 직접 의존관계를 설정해주는 코드가 사라지고 프레임워크에 오브젝트 의존관계의 제어권을 맡길 수 있게 된다.

스프링 빈(Spring Bean)이란?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 부른다.

 

빈이란?

  • Bean은 Spring IoC Container가 관리하는 자바 객체, Spring Bean Container에 존재하는 객체를 말한다.
  • Spring IoC(Inversion of Control) Contatiner에 의해 인스턴스화, 관리, 생성된다.
  • Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다.
  • Spring에서 Bean은 보통 Singleton으로 존재한다.
    Singleton : 어떤 Class가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴

Bean 생성 방식

Component Scanning

Spring IoC Container가 IoC Container를 만들고 그 안에 Bean을 등록할때 사용하는 Interface들을 Life Cycle Callback이라고 부른다.

Life Cycle Callback 중에는 @Component이 붙어있는 모든 Class의 Instance를 생성해 Bean으로 등록하는 작업을 수행하는 Annotation Processor가 등록 돼있다.
Instance : 일반적으로 실행 중인 임의의 프로세스, 해당 클래스의 구조로 컴퓨터 저장공간에서 할당되어 현재 생성된 Object를 의미.

이때, @ComonentScan Annotation이 붙어있는 Class가 이에 해당한다.

 

즉, @ComponentScan, @Component Anotation을 사용해서 Bean을 등록하는 방법이다.

 

@ComponentScan은 어느 지점부터 Component를 찾으라고 알려주는 역할을 하고,

@Component는 실제로 찾아서 Bean으로 등록할 Class를 의미한다.

 

@ComponentScan @Component이 부여된 Class를 찾아 자동으로 Bean으로 등록해주는 역할을 한다.

@ComponentScan이 붙어있는 Class가 있는 package에서부터 모든 하위 package의 모든 Class를 찾아 다니며,

@Component나 @Component를 사용하는 다른 Annotation을 사용하는 Class를 찾는다.
[EX] Stereotype Annotation(@Controller, @Service, @Repository 등)
Stereotype Annotation들은 내부적으로 @Component Annotation을 사용한다.

Configuration

Configuration을 이용한 Bean 등록 방법은, XML에 설정하는 방법과 Java Class에 설정하는 방법이 있다.
Bean 설정파일은 XML과 자바 설정파일로 작성할 수 있는데 일반적으로는 XML에 설정하지만, 최근 추세는 자바 설정파일을 좀 더 많이 사용한다.

 

@Configuration 사용, @Bean 정의

먼저 Java class에서 @Configuration Annotation을 사용해서 직접 @Bean을 등록해주는 방법이다.
일반적으로 xxxxConfiguration와 같이 명명한다.

@Bean Annotation을 사용해 직접 Bean을 정의하면 자동으로 Bean으로 등록된다.

이렇게 Bean을 직접 정의해서 등록하면 @Component Annotation을 붙이지 않아도 된다.

 

Bean Scope

Spring은 기본적으로 모든 Bean을 Singleton으로 생성하여 관리한다.
Singleton Bean은 Spring Container에서 한 번 생성 후, Container가 사라질 때 Bean도 제거.
생성된 하나의 Instance는 Single Beans Cache에 저장되고, 해당 Bean에 대한 요청과 참조가 있으면 캐시된 객체를 반환.
하나만 생성되기 때문에 동일한 것을 참조, 기본적으로 모든 Bean은 Scope가 명시적으로 지정되지 않으면 Singleton.

구체적으로는 Application 구동 시 JVM 안에서 스프링이 Bean마다 하나의 객체를 생성하는 것을 의미한다.

그래서 Spring을 통해서 Bean을 주입 받으면 언제나 주입받은 Bean은 동일한 객체라는 가정하에서 개발 한다.

 

 

배운 것

전반적인 스프링 부트에대한 기동원리와 거기서 사용하는 언어테이션 등 자바의 기본적인 문법들을 배운 뒤 그것을 활용하는 방법에 익수해지는 시간이였다.

 

아쉬웠던 점/느낀점

처음 배우는 언어인 만큼 여러가지 프레임워크들을 사용해야 했다. JPA를 사용하면서 기존의 사용하던 쿼리문을 사용하지 않아 처음에는 불편한 감이 있었지만 JPA에서 자동으로 쿼리문을 만들어주고 처음에는 이걸 왜 사용하지? 이런 생각을 했지만 조금씩 코드가 복잡해지면서 가독성? 코드 길이 등 처리속도가 빨라지는 것을 느꼈다.

스프링 부트에서 쓰는 어노테이션 아예 새로운 언어로 느껴졌고 그것에 대한 기능들을 알지 못해 사용하은 하지만 이게 왜 되는지는 생각해보지 않고 했었던 것 같다. 기본적인 셋팅과정등 붙여넣기만 하는게 아니라 그거를 실행 시켜보고 이게 왜 작동하는지는 공식 문서 밑 구글링을 하면서 좀 더 자세하게 알아보아야 할 것 같다.

 

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 (9기) 6주차 WLI 회고  (0) 2022.10.30
항해 99 주차 4WIL  (0) 2022.10.16
항해 99(9기) 2주차 회고  (0) 2022.10.02
항해 99 (9기) 1주차 회고  (1) 2022.09.25

알고리즘 공부 및 테스트가 있었고  

금요일 부터 주특기 Spring 본격 시작하였다.

 

  • 기간 9월 23일(금)~29일(목)
  • 알고리즘 문제 해결 및 코딩 테스트 준비, 자바 문법 익숙해지기

 

JVM, JRE, JDK의 차이

자바에서 사용하는 용어 중 혼동하기 쉬운 JVM, JRE, JDK에 대해서 정리해 보자.

JVM

JVM은 자바 가상머신(Java Virtual Machine)의 약자이다.

JVM은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있다. 또한 JVM은 플랫폼에 의존적이다. 즉 리눅스의 JVM과 윈도우즈의 JVM은 다르다. 단, 컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있다.

JVM은 다음과 같은 역할을 한다.

  • 바이너리 코드를 읽는다.
  • 바이너리 코드를 검증한다.
  • 바이너리 코드를 실행한다.
  • 실행환경(Runtime Environment)의 규격을 제공한다. (필요한 라이브러리 및 기타파일)

JRE

JRE는 자바 실행환경(Java Runtime Environment)의 약자이다.

JRE는 JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다. JRE는 JVM의 실행환경을 구현했다고 할 수 있다.

JDK

JDK는 자바 개발도구(Java Development Kit)의 약자이다.

JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.

A2 JVM, JRE, JDK의 차이 - 점프 투 자바 (wikidocs.net)

 

메모리

 

 

출처 : http://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0

 

메서드 영역

 

메소드 영역은 Class Area, Code Area, Static Area로 불려지며, 의미상 공유 메모리 영역이라고도 불린다. 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스 별로 런타임 상수 풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다. 메소드 영역은 JVM이 동작해서 클래스가 로딩될때 생성되고, 모든 스레드가 공유하는 영역이다.

 

1. 클래스 내부에서는 직접 접근이 가능하다.(왜? 라고 생각 되면, 위의 내용을 다시 한번...)

public class StaticExample { 
  static int count = 0;

  StaticExample() {}

  public void increase() {
    count += 1;
  }
}

 

 

2. 클래스 이름으로 접근, 인스턴스 생성 후 접근(인스턴스 변수와의 구분이 어렵다. 권장하지 않는다.)

 

public class Main { 
  public static void main(String[] args) {
    StaticExample.count++; //클래스 이름으로 접근

    StaticExample staticExample = new StaticExample();
    staticExample.count++;  //인스턴스 생성 후 접근(권장하지 않음.)
}

 

스텍 영역

 

Stack

  • Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • 지역변수들은 scope 에 따른 visibility 를 가진다.
  • 각 Thread 는 자신만의 stack 을 가진다.

Stack 에는 heap 영역에 생성된 Object 타입의 데이터들에 대한 참조를 위한 값들이 할당된다. 또한, 원시타입(primitive types) - byte, short, int, long, double, float, boolean, char 타입의 데이터들이 할당된다. 이때 원시타입의 데이터들에 대해서는 참조값을 저장하는 것이 아니라 실제 값을 stack 에 직접 저장하게 된다.

 

Heap area(힙 메모리 영역)

 

 인스턴스를 생성하는 방법은 "클래스 변수 =  new 클래스();" 라는 것을 기억하면서 밑에 내용을 확인해 보자.
 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다. 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값) new 연산자를 통해 리턴 받는다. 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.

 
public class HeapAreaEx01 {
    public static void main(String[] args) {
        int[] a = null; // int형 배열 선언 및 Stack 영역 공간 할당
        System.out.println(a); // 결과 : null
        a = new int[5]; // Heap 영역에 5개의 연속된 공간 할당 및 
        // 변수 a에 참조값 할당
        System.out.println(a); // 결과 : @15db9742 (참조값)
    }
}

 설명은 소스 코드의 주석 처리된 부분과 같다. 결국 a변수는 데이터가 저장된 Heap영역의 참조 값을 리턴 받아 갖고 있다는 것이다. 다른 예제도 확인해보자.

 

 
public class HeapAreaEx02 {
    public static void main(String[] args) {
        String str1 = new String("joker");
        String str2 = new String("joker");
        if(str1 == str2){
            System.out.println("같은 주소값 입니다.");
        }else{
            System.out.println("다른 주소값 입니다.");
        }
    }
}

 

 문자열을 저장하는 String도 참조형이다. new 연산자를 이용해서 생성하면 데이터는 Heap 영역에 저장되고 str1과 str2는 참조 값을 리턴 받는다. 저장된 주소가 다르기 때문에 "=="으로 비교 시 "다른 주소값 입니다."가 출력되는 것이다. 마지막으로 예제를 하나 더 살펴보자.

 

 

class A{}

public class HeapArea {
    public static void main(String[] args) {
        A a = null; // A타입의 a객체 선언 및 Stack 영역 공간 할당
        System.out.println(a); // 결과 : null
        a = new A(); // Heap 메모리에 공간 할당 및 객체(a)에 참조값 할당
        System.out.println(a); // 결과 : @15db9742
    }
}

 소스 코드에 주석 처리한 내용으로 설명은 대신하겠다. 결국 객체가 참조 값을 갖는다는 것이다.

 참고로 Heap에 저장된 데이터가 더 이상 사용이 불필요하다면 메모리 관리를 위해 JVM(자바 가상머신)에 의해 알아서 해제된다. 이러한 기능을 가비지컬렉션(GC, 쓰레기 수집)이라고 한다. 
 메모리 관련 내용은 여기서 마무리하겠다. 메모리는 중요한 부분이고 인스턴스 등을 정의할 때 왜 이렇게 사용하는지 이해하는 것이 코딩하는데 있어 많은 도움이 될 것이다. 

배운 것

알고리즘 문제 해결을 통한 구체적인 구현력과 사고력을 향상시킬수 있는 주였고,

JVM 및 세부사항 및 JAVA WEB의 꽃인 SPRING BOOT 가 기본적으로 어떻게 실행 되고 작동되는지 알수 있었다.

 

아쉬웠던 점/느낀점

알고리즘 문제를 풀면서 처음에는 문제를 잘 이해하지 못하고 어떻게 문법을 써야하는지도 잘 알지 못했다.

남들보다 더 많은 시간을 투자해서 공부를 해 주어진 40문제를 풀긴 했지만,  짧은 시간인 만큼 정말 이해가 가지 않는 문제의 경우 그냥 풀의만 보고 해석해보고 정 안되면 그냥 넘겨버린 문제들이 있다.  알고리즘 주를 보내면서 내 실력에 대해 잘 알게 되었고 , 앞으로도 알고리즘 문제는 조금씩이라도 풀어보며 더 익숙해질 것이라고 다짐했다.

또한 사용자의 요구사항을 주어진 기능적으로 구현을 해야하는 것에 대해 조금은 이해를 할 수 있는 시간이엿다.

 

 

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 (9기) 6주차 WLI 회고  (0) 2022.10.30
항해 99 주차 4WIL  (0) 2022.10.16
항해 99(9기) 3주차 WTL 회고  (0) 2022.10.09
항해 99 (9기) 1주차 회고  (1) 2022.09.25

기간 : 2022.09.09 ~ 2022.09.13 (4일간 진행)
프로젝트명 : youcoding

1. 기획 배경

우리가 코딩을 시작하면 서 제일로 중요한 것은 기본 지식을 아는 것이긴 하지만, 그 지식으로 검색을 해서 자신이 원하는 검색 결과를 찾아내는 것이다. 그것을 글로보다는 영상으로 설명되어 있는 것을 보면서 더욱 쉽게 이해할수 있게 하는 자신이 원하는 언어 강의 동영상을 모아둔 사이트. 

 

기본 레이아웃

언어페이지 별로 들어가면 기본적으로 인기순의 유튜브 동영상이 뜬다.

2.나는 기본적인 페이지 전반으로 레이아웃(페이지 네비게이션바 및 레이아웃), 언어별 페이지를 구현

 

  • 우선 언어별로 페이지를 작성
  • 유튜브 API를 가져와 영상들의 정보를 DB에 저장
    ->유튜브 할당량으로 인한 API 유지가 불가능 하여 크롤링으로 대체 ㅜㅜ
  • 페이지 정렬 조회수 좋아요 등록순 구현
    ->API 데이터 사용 불가로 크롤링으로 데이터를 가져오는 중 조회수 있는 데이터와 없는 데이터가 있어 인기순으로 교체.. 날짜도 들어오지 않음. 그래서 타이틀 오름차순 내림차순으로 교체
  • 썸네일과 타이틀 클릭시 비디오 시청페이지로 링크 이동 하며 비디오 아이디를 url로 같이 넘김

3.깃헙 주소

https://github.com/jossiya/youcoding

 

4 배운것

  • JWT인증 방식과 Jjnfa2 를 이용한 서버사이드 렌더링에 대해 알게되었고 서버쪽에서 정보를 어떻게 가져오고 이를 이용해 페이지이동을 더욱 쉽게 할 수 있다는 것을 알게 되었다.
  • 아직 초기 단계이지만 협업으로 인한 팀원들간 커뮤니케이션을 하는 것이 중요하다는 것을 깨닫는 시간이 었고 자신이 모르는 것을 고민후 물어보고 팀원이 모르는것을 같이 찾아보면서 문제 해결해가는 방식을 배운 소중한 시간이었다. 

-jinja2

  • Python에서 사용하는 데이터와 템플릿을 연결시켜주는 기능

-JWT

  • 사용자에 대한 정보가 토큰 자체에 포함
  • 저장소를 서버에 따로 만드는 세션/키 방식이 아니다. 요청이 많은 시 생기는 과부하를 줄여준다.
  • 트레픽에 대한 부담이 낮아짐
  • 쿠키에 대한 취약점이 사라짐

-API

  • 웹 사이트 개발에 다른 서비스에 요청을 보내고 응답을 받기 위해 열려있는 일종의 은행창구 역할

-GITHUB

  • 로컬저장소와와 원격저장소로 나누어 팀원들 또는 사용자들과 데이터를 공유 

5. 아쉬웠던점

프로젝트 기간이 4일밖에 되지 않아 자신이 원하는 기능을 온전히 구현하지 못한게 너무 아쉬웠다.

파이참이라는 IDE를 처음 써보기도 했고 파이선에 대해 많은 것을 알지 못해 어려움이 있었다.

또한 나혼자서 깃허브를 사용해보긴 했지만 깃허브에 콜라보레이션기능이 있는 것을 알았고 처음 써보는 것이기에 초반에

PUSH 및 PULL에 충돌로 인해 애를 먹었고 병합하는 과정에서도 코드들이 석여 애를 먹었다.


4일이라는 시간동안 자신이 알고있는 것과 구글링에 의해 개발하는 것은 상당히 익숙하지않아 힘이들었다. 그만큼 어렵고 정신 없었고 블로그를 통한 하루를 정리하는 시간을 가지며 자신이 모르는 것을 정리해가며 다시한번 머리에 새기는 것이 정말 좋다는 것을 깨달았다. 공부를 꾸준히하며 처음 정한 목표와 다짐을 잃지 않고 열심히 해서 훌륭한 개발자가 되고 싶다.

'항해 99(9기) > WIL' 카테고리의 다른 글

항해 99 (9기) 7주차 WIL  (0) 2022.11.06
항해 (9기) 6주차 WLI 회고  (0) 2022.10.30
항해 99 주차 4WIL  (0) 2022.10.16
항해 99(9기) 3주차 WTL 회고  (0) 2022.10.09
항해 99(9기) 2주차 회고  (0) 2022.10.02

+ Recent posts