InelliJ 에서 Java 설치까지 완료하였다.

이제 Java에 대한 문법을 기초부터 차근차근 진행하려고 한다.

 

우선 Java에서 파일을 만들면 아래와 같은 파일이 생성된다.

 

 

package 폴더이름(package 이름);

public class 파일명 {
}

 

아래와 같이 입력하면 Java를 사용하여 Hellow World 를 출력할 수 있다.

package chap_01;

public class _01_HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!!!"); // println("")안의 내용을 콘솔에 출력 할 수 있다.
    }
}

 

 

콘솔 실행하기 ( Shift + F10 )

 

우선은 위 함수는 main 이라는 함수에서 "Hello Wordl!!" 를 출력할 수 있는 함수라고 생각하자.

 

참고영상 : https://www.youtube.com/watch?v=NQq0dOoEPUM

'Java' 카테고리의 다른 글

Java - 문자열 자유자재로 사용하기  (0) 2023.05.04
Java - 연산하기  (0) 2023.05.04
Java - 변수 선언과 사용하기  (0) 2023.05.04
Window 환경에서 Java 설치하기 - JDK, IDE  (0) 2023.05.04
Java를 시작하며  (0) 2023.05.04

 

Java를 시작하기전 사용하기 위해 Java를 설치해야한다.

 

아래과정을 통해 Window에서 Java를 설치할 수 있다.

 

1. 링크 접속

https://adoptium.net/

 

Home | Adoptium

The Adoptium® Working Group The Adoptium Working Group promotes and supports high-quality runtimes and associated technology for use across the Java ecosystem. Our vision is to meet the needs of Eclipse and the broader Java community by providing runtimes

adoptium.net

 

2.  Other platforms and versions 클릭 ( 최신 버전이 아닌 실무에서 가장 많이 사용하는 8버전 다운 )

 

3. Version 8, Operating System : windows 변경 후 bit에 맞는 버전 설치 

4. Next -> 경로 변경 :  Eclipse Adoptium를 Java로 변경 -> Set JAVA_HOME variable 활성화 -> Next -> Install

 

5. 설치 확인 

터미널 접속 -> java -version 입력 후 버전 확인

 

 

6. IDE 설치 ( intellij )

7.  설정

 

 

 

 

 

 

 

참고영상 : https://www.youtube.com/watch?v=NQq0dOoEPUM

'Java' 카테고리의 다른 글

Java - 문자열 자유자재로 사용하기  (0) 2023.05.04
Java - 연산하기  (0) 2023.05.04
Java - 변수 선언과 사용하기  (0) 2023.05.04
Java - Hellow World 출력하기  (0) 2023.05.04
Java를 시작하며  (0) 2023.05.04

Java를 왜 배워야할까?

 

프론트엔드 교육을 마치고 스타트업 데이터스'사에 인턴으로 근무하게 되었다.

 

내가 Java를 학습하는 가장 큰 이유는 앞으로 프론트엔드 뿐 아니라 풀스텍 개발자가 되기 위한 준비를 스스로 해야한다고 강하게 생각하였다. 인턴으로 근무하게 된 회사에서 Java, Spring을 선호하는 이유도 있지만, 개인적으로 Java는 꽤나 매력적인 언어라고 생각한다.

 

우선 JavaScript와 동일하게 객체지향언어라는점, 꽤 오래전부터 사용되어 Java 레퍼런스, 아직까지 사용하고 있는 회사가 많은점, 안정적인 백엔드서버를 구축할 수 있는 점 등 Java를 심도있게 공부하고 익힌다면 경쟁력 있는 개발자가 될 수 있을 것이라는 확신이 들었다.

 

앞으로 한달동안은 YouTube 강의나 '이것이 자바다' 책을 보면서 스스로 학습하고 기록을 남기려고 한다. 

'Java' 카테고리의 다른 글

Java - 문자열 자유자재로 사용하기  (0) 2023.05.04
Java - 연산하기  (0) 2023.05.04
Java - 변수 선언과 사용하기  (0) 2023.05.04
Java - Hellow World 출력하기  (0) 2023.05.04
Window 환경에서 Java 설치하기 - JDK, IDE  (0) 2023.05.04

2주차가 끝나면서 대부분의 UI와 기능 구현이 끝났지만 팀원 데이터를 모두 merge하면서 eslint, type 에러가 종종 발견되었다.

 

기능 하나씩 구현하면서 작은 기능까지 디테일하게 수정해야 할 것 같다.

 

잘되는부분도 있지만 디테일한 부분에서 에러가 많이 보이고있다.

 

팀프로젝트를 진행하면서 왜 백엔드팀과 협업하는 경험이 중요한지, 프론트엔드팀 담당자들과도 소통이 얼마나 중요한지 한번 더 느끼게 되었다.

 

 

기능 별로 branch를 나눠서 진행하다보니 주기적으로 branch를 정리하면서 사용하고있다. 

처음에는 이렇게 복잡한걸 꼭 써야하나...? 파일로 관리하면 안되나? 생각했는데 사용하고보니 확실히 이전에 작업했던 내용을 보관하고, 작업내용을 날리는 위험을 줄일 수 있음을 느꼈다. 

 

 

 

현재 날짜 기준으로 예약이 불가능하게 만드는 것이 어려울 것 같았는데 생각보다 간단하고 빠르게 끝났다. 

 

git도 그렇고 기능도 그렇고 어렵고 복잡해보이지만 아직 내가 많이 부족한 것이였다고 느낀다... 

어려워보인다고 포기하지말고 끝까지 완료하는 습관을 가지게하는 원동력 중 하나가 될 수 있었다.

 

남은 시간동안 발생하는 에러를 모두 처리하고 렌딩페이지, 반응형 구현하면 팀프로젝트도 어느정도 마무리 될 수 있을 것 같다.

팀프로젝트를 진행하면서 적용하면 좋을 적절한 애니메이션을 고민하던 중,

아주 유용하게 사용할 수 있을 것 같은 라이브러리를 발견했다.

 

React-Spring의 가장 큰 장점은 애니메이션이 실행될때 re-render가 되지 않는다는 점이다.

일반적으로 react에서 useState 값을 사용하여 클릭 상태 변화에 따라 애니메이션을 다시 그려야하므로 리렌더 될 수 밖에 없다.

하지만 useSpring을 사용하면 해당 과정 없이 애니메이션을 동작시킬수 있다고 한다.

눈에 보이는 효과는 아직 없겠지만, 관리해야 할 useState가 많거나, 애니메이션을 많이 사용하게되면 매우 유용할 것 같다

 

import * as S from "./index.styled";
import { animated, useSpring } from "@react-spring/web";

export default function Page1() {
 
 const springs = useSpring({
    from: { x: 0 },
    to: { x: 100 },
  })


  return (
    <S.Container>
      <S.Wrapper>
        <animated.div
          style={{
            width: 80,
            height: 80,
            background: "#ff6d6d",
            borderRadius: 8,
            ...springs,
          }}
        />
      </S.Wrapper>
    </S.Container>
  );
}

일반적인 태그가 아니라 <animated.div/> 태그 의 style 속성으로 스타일할 수 있고, 애니메이션을 주기 위해서 useSpring을 사용해야한다. 이렇게 사용하면 첫 페이지 렌더링시 x가 100만큼 1번 이동한다. ( 배경 및 배치는 emotion/styled 사용 중 )

평소 사용하는 hooks 처럼 useSpring안에 원하는 애니메이션을 넣어주고 태그안에 ...spring을 바인딩시켜주면 끝이다!

 

클릭시 원하는 애니메이션을 작동시켜주는 것은 useSpring안에 api 라는 메서드를 추가하고, 함수로 변경하면된다.

  const [springs, api] = useSpring(() => ({
    from: { x: 0, y: 0 },
  }));

  const handleClick = () => {
    api.start({
      from: {
        x: 0,
        y: 0,
      },
      to: {
        x: 100,
        y: 100,
      },
    });
  };

handleClick은 animated.div 태그 onClick에 적용

그럼 React-Spring을 이용해서 아래 애니메이션을 만들어보자

CSS와 React만 사용해도 만들 수 있을 것 같지만 이번에는 React-Spring을 사용하면 좋을 것 같았다.

기본원리는 두 이미지가 동일한 위치와 사이즈로 있으며 투명도가 서로 0 -> 1, 1 -> 0 으로 변경되는고 x 축으로 180도씩 돌아가게 하는 것이다.

 

내가 사용하는 css 라이브러리인 emotion/styled와 예시 코드로 제공되는 css 방법이 다르기때문에 약간의 변화가 필요했다... 

useSpring 에서 제공하는 태그를 사용한 후 style을 적용해야 하므로 css에서 Wrapper 의 div, Wrapper의 span으로 구분하였다.

import * as S from "./index.styled";
import { animated, useSpring } from "@react-spring/web";
import { useState } from "react";

export default function Page1() {
  const [rotate, setRotate] = useState(false);
  const { transform, opacity } = useSpring({
    opacity: rotate ? 1 : 0,
    transform: `perspective(500px) rotateX(${rotate ? 180 : 0}deg)`,
  });

  const onClickRotate = () => {
    setRotate((prev) => !prev);
  };

  return (
    <S.Container>
      <S.Wrapper onClick={onClickRotate}>
        <animated.div
          style={{ opacity: opacity.to((o) => 1 - o), transform }}
        />
        <animated.span style={{ opacity, transform, rotateX: "180deg" }} />
      </S.Wrapper>
    </S.Container>
  );
}
import styled from "@emotion/styled";
import * as GS from "../../../../theme/global";

export const Container = styled.div`
  width: 100%;
  height: 100vh;
  background-color: ${GS.base.primary};
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
`;

export const Wrapper = styled.div`
  width: 82%;
  height: 80%;
  position: relative;

  div {
    display: flex;
    width: 500px;
    height: 300px;
    background-color: black;
    position: absolute;
    opacity: 1;
    cursor: pointer;

    ::before {
      content: "kk-jae 앞면입니다.";
      color: white;
    }
  }

  span {
    display: flex;
    width: 500px;
    height: 300px;
    background-color: pink;
    position: absolute;
    opacity: 0;
    cursor: pointer;

    ::before {
      content: "kk-jae 뒷면입니다";
    }
  }
`;

 

애니메이션을 다채롭게 적용하기 위해서는 css 셀렉터도 다시 한번 학습할 필요가 있을 것 같다.

 

 

React-Spring  https://www.react-spring.dev/

 

React Spring

Bring your components to life with simple spring animation primitives for React

www.react-spring.dev

 

정규수업이 마무리되고 팀 프로젝트가 진행되었다.

프론트엔드 4명, 백엔드 3명이 지정되어 프로젝트를 시작하게 되었다.

 

처음 담당자들과 만나 가장 먼저 고민한 것은 어떤 페이지를 만들 것인지였다.

 

20가지 이상의 아이디어가 나왔는데, 최종으로 결정된 것은 애견 미용 플랫폼이다.

 

이번 프로젝트에서 FE 의 주요 수행 과정은 아토믹패턴 / 지도 / 일정관리가 될 것 같다.

 

1주차에는 사용하는 초기셋팅, 협업에 필요한 과정을 하나씩 정리했다.

 

1. 초기 셋팅 

Next.js : SSR 렌더링 구현

TypeScript : 타입을 지정하여 차후 에러 방지

React : JS 및 컴포넌트 사용 등의 장점이 있는 JS 라이브러리 리액트 사용

GraphQL : rest API의 오버패칭 문제 해결 및 원하는 값만 가져올 수 있는 GraphQL 사용

ESlint : 다양한 플러그인을 사용하거나 새로운 규칙을 추가할 수 있고, 많은 사람들의 가독성을 위해 사용 

Recoil : 초기 셋팅이 번거로운 Redux 대신 Recoil 선정

Emotion : css props를 사용할 수 있는 emotion 스타일 사용

 

 

2. 협업

Git : 프로젝트 관리

Jira : 업무 분담 및 진행 상황 관리

Figma : UI 및 컴포넌트 디자인 확인

 

팀원 중 Jira나 Figma를 다뤄본 경험이 있는 팀원분들이 있어 많은 도움을 받았다. 새로운 방법이나 툴을 사용해볼 기회가 생긴 것 같았다.

또한 페이지별로 파일을 구성하는 것이 아니라 실제로 협업에서 사용하는 것처럼 Input, Button, ListBox, Badge등을 만들고 페이지에 적용하는 구조로 FE를 만들 계획이다.

atomic 패턴 구조

 

 

 

처음 개발자가 되고싶은 마음을 가졌을때, 독학을 고민했었다.

그러나 실제 독학을하면서 느낀점은 이렇게 하면 너무 많은 시간을 낭비할 것 같은 생각이 들게 되어 부트캠프를 알아보게 되었다.

 

나는 아래 내용을 먼저 고민하였다.

 

1. 온라인 / 오프라인

개인적으로 온라인보다 오프라인으로 참석하는 것이 나에게 도움이 많이 될 것 같았다. 

실제로 오프라인으로 진행했을때, 팀원들과의 협업, 소통하는 과정에서 많은 것을 배웠다.

 

2. 기간 

보통 국비지원은 6개월 코스로 진행되어 학습기간이 길었다. 분명 오래 학습하면 도움이 될 수 있지만, 나는 빠른 수료와 취업도 목적이었다.

 

3. 부트캠프 / 국비지원

부트캠프와 국비지원은 비슷하지만 많이 달랐다. 대표적으로는 비용, 수강기간, 수강생 규모 등이 있었다.

 

국비지원 : 무료, 6개월, 검증되지 않은 강사진, 많은 수강생 관리

부트캠프 : 유료, 3개월, 검증된 강사진, 소규모 수강생 관리

 

비용이 발생한다는 부분을 제외하고는 부트캠프가 더욱 매력적으로 느껴졌고 나는 부트캠프를 선택하게 되었다.

 

 

코트캠프를 선택하게 된 이유

1. 소규모 수강생 관리

비전공자로 개발을 시작하게 된다면 분명 많은 질문과 궁금한 내용이 나올 것이라고 생각했다.

그래서 소규모로 관리하고 밀착관리해주는 부트캠프를 찾았다. 

코드캠프는 강사님과 담당멘토가 함께 관리하여 1:1로 관리한다는 느낌을 받을 수 있을 것이라고 생각했다. 

2. 좋은 위치와 24시간 오픈

구로디지털단지 도보 5분 거리로 출석하기 간편했고, 언제든 와서 학습할 수 있다는 장점이 있었다.

정규 수업과 별개로 아침이든 새벽이든 언제든 와서 이용 할 수 있었다.

3. 검증된 커리큘럼

최신 기술이 적용된 기술에서 핵심만 쏙쏙 학습할 수 있었습니다.

4. 기초 학습

오프라인 강의가 시작되기 전 한달간 온라인으로 HTML, CSS, JS의 기초를 탄탄히 할 수 있었습니다.

온라인으로 진행할때도 게더타운을 이용해서 동기, 멘토님들과 실시간으로 소통 할 수 있었습니다.

 

실제로 학습을 진행하면서 24시간 오픈된 학습공간, 열정적인 동기들과 멘토들이 함께하여 수강하는데 큰 어려움이 없었고 즐겁게 학습할 수 있었습니다. 학습이 끝나고 취업까지 계속해서 피드백 받으니, 든든한 지원군이 생긴 기분을 느낄 수 있었습니다. 

 

 

 

 

 

 

구조분해 할당(비구조화 할당)

const aboutMe = {
		name : "정혜원",
		age : 23456,
		position : "frontend",
		adress : "성북구",
		favoriteFood : "치킨",
	}

위에 보시는 것 과 같이 객체가 하나 있습니다.

만일, 저 객체 안에 있는 값들을 하나씩 모두 분해해서 변수에 할당을 해줘야 하는 상황이라면 어떨까요?

아마 여러분들은 객체의 키값에 접근해서 할당을 해주실 것 입니다. 아래와 같이요.

const name = aboutMe.name

const age = aboutMe.age

const position = aboutMe.position

const address = aboutMe.address

const favoriteFood = aboutMe.favoriteFood

생각만해도 굉장히 귀찮고, 보는것만으로도 가독성이 매우 떨어지지 않나요?

그런데 위에서 한 여러번의 선언과 할당과정을 한번에 처리하는 방법이 있습니다.

바로 **구조분해 할당(비구조화 할당)** 입니다.

구조분해 할당에는 배열과 객체의 구조분해 할당이 있으며 아래에서 자세히 알아보도록 하겠습니다.


배열의 구조 분해할당

위에서 말씀 드렸듯, 구조분해 할당은 여러번의 선언과 할당과정을 한번에 처리하는 과정이라고 말씀 드렸습니다.

따라서 **배열의 구조분해 할당**은 배열 내부의 값을 여러 변수에 나눠 담는 과정을 한번에 처리한다 생각하시면 됩니다.

const numbers = [0, 1, 2];

**let [ zero, one, two ] = numbers;** // 선언과 동시에 할당

즉,

const zero = number[0]

const one = number[1]

const two = number[2]

와 같이 여러번에 거친 과정을 배열의 구조분해 할당을 이용하시면 위와같이 한번에 처리가 가능합니다.

우리가 자주 사용해왔던 배열의 구조분해 할당!

우리는 이미 자주 사용하는 배열구조분해가 있습니다.

예상하신 분들도 계시겠지만, 바로 useState 를 선언할 때 입니다.

**const [state,setState] = useState()**

이제 보이시나요? 우리는 지금까지 배열의 구조분해 할당을 사용해서 useState를 사용하고 있었습니다.

<aside> 💡 할당하려는 변수가 더 많거나 적으면? → 적은 경우에는 더이상 할당되지 않고, 많은경우에는 undefined가 할당 됩니다.

// 적을 경우
let [one,two] = [1,2,3,4]

	//결과값은 아래와 같이 구조분해 된다.
	let one = 1
	let two = 2
	
// 많을 경우
let [one,two,three,four] = [1,2,3]
	//결과값은 아래와 같이 구조분해 된다.
	let one = 1
	let two = 2
	let three = 3
	let four = undefined

</aside>

💡배열 구조분해 어떤상황에서 사용할까요?

배열에서 따로 담아둬야 할 값이 2개 이상이라면 한번에 구조분해 할당을 이용해 선언과 할당을 진행하면 편리합니다.

예를 들면 아래와 같은 상황일때 구조분해 할당을 이용하시면 편리합니다!

// 2,5,7번 인덱스 값을 뽑아 변수에 담아야 한다.
let arr = [1,2,3,4,5,6,7,8,9]
let [ index2,index5,index7 ] = [ arr[2],arr[5],arr[7] ]

객체의 구조분해 할당

객체의 구조분해 할당은 배열의 구조분해 할당과는 조금 다릅니다.

객체의 구조분해 할당에서의 변수명을 객체의 key값으로 선언해주셔야 합니다.

const aboutMe = {
		name : "정혜원",
		age : 23456,
		position : "frontend",
		adress : "성북구",
		favoriteFood : "치킨",
	}

// 이름과 나이만 뽑아서 새로운 변수에 담아주고 싶을 때
const { name,age } = aboutMe

//결과
// name = "정혜원"
// age = 23456

또한 배열에서는 선언과 할당이 따로 일어나도 상관이 없었지만, 객체는 선언과 할당이 동시에 일어나야 합니다.

let [ name ]

[ name ] = ”정혜원”

배열은 위와 같이 선언과 할당을 따로 해도 문제가 없지만, 객체는 안된다는 뜻 입니다.

<aside> 💡 만일 없는 키를 선언하고 할당하게 되면? → 없는키는 할당값이 undefined로 들어가게 됩니다.

const aboutMe = {
		name : "정혜원",
		age : 23456,
		position : "frontend",
		adress : "성북구"
	}

// hight라는 없는 key를 선언하고 할당하기
const { hight, age } = aboutMe

// 결과
// hight = undefined
// age = 23456

</aside>


Rest 파라미터

우리가 특정 객체에서 지우고싶은 데이터가 있을 때 어떻게 할까요?

과연 **delete**를 사용해 원본 데이터를 삭제할까요?

사실 원본을 건드리는 일은 그리 바람직하지 못합니다.

원본이 어디서 어떻게 사용되고 있을 지 모르기 때문에 원본을 사용하는 곳에서 예상치 못한 에러를 직면하게 될 수 있습니다.

따라서 원본을 건들이지 않고 삭제하기 위해 rest 파라미터를 이용합니다.

rest 파라미터는 구조분해 할당과 함께 사용합니다.

const me = {
	name: "정혜원",
	age: 123,
	hobby: "공부",
	dream: "30년차 자바스크립트 개발자"
	}

// 구조분해 할당
**const { money, hobby, ...rest } = child**

이렇게 적으면 rest변수에는 dream과 hobby를 제외한 모든게 들어가게 됩니다.

즉, rest를 호출하게 되면 dream과 hobby를 제외한 프로퍼티가 담긴 객체가 호출되는 것 입니다.

따라서 rest 파라미터를 사용하게 되면, 삭제할 프로퍼티를 제외한 모든 데이터를 간편하게 골라낼 수 있습니다.

 

 

 

 

출처 : 코드캠프

 

 

1. Pagination 

페이지의 번호를 클릭하여 게시물을 보여주는 방식

 

일반적으로 이전, 다음 버튼이 존재하고 보여주는 게시글에 숫자가 강조된다.

얼마나 늘어날지 모르기때문에 map을 사용하여 작성한다.

 

 

2. Infinite Scroll 

스크롤을 내리면 나머지 게시글을 화면에 띄우는 방식

 

InfiniteScroll 라이브러리 (react-infinite-scroller) 를 사용하여 구현한다.

 

두가지 방법 모두 페이지의 컨셉에 맞게 사용하면 된다.

 

 

useRef 는 리액트제공하는 Hooks 기능 중 하나이다.

 

useRef를 선언 후 태그에 ref={ 변수명 } 로 지정할 수 있다.

마치 태그의 고유 이름인 id를 주는 것과 비슷하다.

 

가장 기본적인 기능은 input의 focus를 맞추는데 사용할 수 있다.

 

기본적으로 페이지에 접속하거나 특정 버튼 및 동작을 하고 특정 input에서 깜빡거리는것을 볼 수 있다

useRef() 를 활용하여 가능하다.

 

import { useRef } from "react";

export default function USERefPage() {
  const writerInput = useRef(null);

  const onClickRefTest = () => {
    writerInput.current.focus();
    console.log(writerInput);
  };
  return (
    <div>
      <div>
        작성자 : <input ref={writerInput} />
      </div>
      <div>
        내용 : <input />
      </div>
      <div>
        비밀번호 : <input />
      </div>
      <button onClick={onClickRefTest}>ref 버튼</button>
    </div>
  );
}

 

ref 버튼을 클릭하면 지정해놓은 "작성자"의 input으로 focus 된다.

 

이 기능은 스타일을 꾸밀때 활용하면 좋을 것 같다.

+ Recent posts