분류 전체보기 363

[컴퓨터 구조] 컴퓨터 시스템의 구성

컴퓨터의 기본 구성은 하드웨어, 소프트웨어 두 가지로 구성됩니다. 하드웨어 : 컴퓨터에서 각종 정보를 입력하여 처리하고 저장하는 동작이 실제로 일어나게 해주는 실체이며 시스템이 동작하는 데 있어서 필요한 물리적 구성 요소 소프트웨어 : 컴퓨터에게 동작 방법을 지시하는 명령어 집합의 모임, 프로그램(컴퓨터를 사용해 어떤 일을 처리하기 위해 순차적으로 구성된 명령들의 집합) 다음과 같이 하드웨어는 중앙 처리 장치(CPU), 주기억 장치, 보조 기억 장치, 입력 장치, 출력 장치로 구성됩니다. 또한 이들은 컴퓨터의 기능 수행을 위해 시스템 버스를 통해 서로 연결되어 있습니다. 여기에서 말하는 버스는 컴퓨터 부품들 간, 혹은 컴퓨터 간 데이터와 정보를 전송하는 통로입니다. 앞서 설명드린 하드웨어의 구성 요소들의..

CS 2023.04.07

[Spring] 이메일 인증을 구현하기 위한 설정 (SMTP, mail.properties)

오늘은 Spring 기반으로 회원가입 시 이메일 인증 코드를 발급해 주는 기능을 구현해보려고 합니다.해당 기능을 구현함으로써 보안성을 강화하고, 서비스의 신뢰성을 높일뿐더러, 스팸 및 악성 가입을 방지할 수 있습니다. 또한 Spring에서는 JavaMail 모듈이 워낙 잘 되어 있어서 해당 모듈을 활용해야겠다고 생각했습니다.  SMTP를 이용하여 메일 서버를 구축하고, 해당 프로젝트 내에서 MailConfig, mail.properties 설정을 통해 구현하는 과정에 대해 상세히 설명드리도록 하겠습니다. SMTP (Simple Mail Transfer Protocol)인터넷을 통해 이메일을 보내고 받는 데 사용되는 통신 프로토콜 Spring Mail ModuleJavaMail API를 추상화하여 편리한 ..

Java/Spring 2023.04.02

[HTTP] Internet Network

인터넷 통신에서 클라이언트와 서버는 어떻게 통신할까요? 클라이언트 컴퓨터와 서버 컴퓨터 사이에 인터넷이라는 것이 존재합니다. 이 복잡한 인터넷 망은 수많은 노드들로 구성되어 있습니다. 그래서 이러한 복잡한 망을 처리하기 위해 각각의 컴퓨터에 IP(Internet Protocol) 주소라는 것을 부여했습니다. IP프로토콜을 통해 다음과 같이, 클라이언트와 서버는 각각의 IP주소를 통해 Packet 단위로 데이터를 전달할 수 있게 됩니다. IP 패킷은 S.A IP(출발지 IP), D.A IP(목적지 IP), 전송 데이터로 구성되어 있으며, 클라이언트에서 이 패킷을 전송할 때, 수많은 노드들을 거쳐 서버로 전송됩니다. 또한 같은 맥락으로 서버도 잘 받았다는 응답 패킷을 클라이언트로 전송하게 됩니다. 하지만 I..

CS 2023.03.30

[컴퓨터 구조] 컴퓨터의 혁명과 컴퓨터 종류

컴퓨터의 기술이 어떻게 발전해 왔고, 다양한 컴퓨터의 종류에 대해서 알아보려고 합니다. 들어가기에 앞서, Moore's Law(무어의 법칙)에 대해서 간략히 설명드리겠습니다. 설명드리는 이유는 컴퓨터 기술의 발전은 무어의 법칙에 의해 보이기 때문입니다. 무어의 법칙이 어떤 것인지 알아보겠습니다. Moore's Law 반도체 집적회로의 성능(메모리 용량, CPU 속도)이 약 2년마다 2배로 증가합니다. 컴퓨터의 성능은 18개월마다 2배로 증가합니다. 컴퓨터의 가격은 2년마다 반으로 줄어듭니다. 컴퓨터의 발전은 여러 분야에서 나타났습니다. 예시가 몇 가지 있습니다. 자동차 제어 컴퓨터 스마트폰 WWW(World Wide Web) 인간 게놈 프로젝트 검색 엔진 컴퓨터의 종류 개인용 컴퓨터 일반적인 목표, 다양..

CS 2023.03.27

[컴퓨터 구조] 컴퓨터 구조를 알아야 하는 이유

훌륭한 개발자가 되기 위해서는 반드시 컴퓨터 구조와 운영체제를 배워야 합니다. 왜냐하면, 개발자가 내부적인 시스템 오류에 직면했을 때, 컴퓨터 구조에 대한 지식이 부족하다면 이를 해결하지 못하고 어려움을 겪게 될 것입니다. 더불어 개발자 채용 공고에도 컴퓨터 구조에 대한 지식을 요구하는 기업들도 많아지고 있는 추세입니다. 컴퓨터 구조를 배움으로써, 문법에 맞는 소스 코드를 컴퓨터에 입력만 하는 개발자에서 컴퓨터를 내려다보며 문제를 해결할 수 있는 개발자가 될 수 있습니다. 컴퓨터 구조를 알아야 하는 이유 두 가지 문제 해결 능력을 기를 수 있습니다. 성능, 용량, 비용을 고려한 프로그래밍을 할 수 있습니다. 강의실에서 다양한 학생들이 같은 코드를 입력했는데 어떤 사람은 코드가 작동하지만, 또 다른 사람은..

CS 2023.03.27

[Spring] N+1 문제를 해결하기 위한 방안 (fetch join, @EntityGraph)

코드를 보면서 N+1 문제와 이를 해결하기 위한 방안에 대해서 설명드리겠습니다. @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clea..

Java/Spring 2023.03.18

[Spring] Spring Data JPA Paging, Sort 기능

Spring Data JPA는 기본적으로 페이징 기능과 정렬 기능을 제공하고 있습니다. 이들을 사용하기 위해서는 Pageable, Sort 객체가 필요합니다. org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) Pageable 객체에는 페이지 번호, 페이지 크기, 정렬 정보를 가지고 있습니다. @GetMapping("/users") public ResponseEntity getUsers( @RequestParam(defaultValue = "0") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSi..

Java/Spring 2023.03.18

[Spring] Spring Data JPA 공통 인터페이스

구조적으로 JpaRepository는 공통 CRUD기능을 제공하고 있습니다. 그래서 생성한 Repository 인터페이스를 통해 기본적인 CRUD 기능을 구현하지 않아도 사용할 수 있습니다. 이제 공통 인터페이스에 대해 알아보겠습니다. JpaRepository 공통 기능 인터페이스 public interface JpaRepository extends PagingAndSortingRepository JpaRepository를 사용하는 인터페이스 public interface MemberRepository extends JpaRepository { } @Repository 어노테이션을 생략할 수 있는 이유는 Spring Data JPA가 자동으로 컴포넌트 스캔을 처리하고, JPA 관련 예외도 처리해 주기 때..

Java/Spring 2023.03.18

[Spring] Querydsl

Queryds이란 무엇인가? 백엔드 기술은 주로 스프링 부트, 스프링 데이터 JPA를 조합해서 사용합니다. 하지만, 이러한 기술들로도 해결하지 못한 문제들이 있습니다. 바로 복잡한 쿼리, 동적 쿼리와 같은 문제들을 해결할 수 없습니다. 이러한 문제들을 손쉽게 해결할 수 있는 기술이 Querydsl입니다. Querydsl은 HQL(Hibernate Query Language) 쿼리를 안전하게 생성 및 관리해 주는 프레임워크입니다. 또한 쿼리를 자바 언어의 한계를 넘어서 자바 코드로 작성함과 더불어, 문법 오류를 컴파일 시점에 시점에 잡아줍니다. 문법이 SQL과 유사하기에 쉽게 학습할 수 있고, 복잡한 쿼리도 손쉽게 작성할 수 있게 됩니다. JPQL과의 차이를 통해 장점을 설명드리겠습니다. @Test pub..

Java/Spring 2023.03.12

[Java] 객체지향 사실과 오해 1- 협력하는 객체들의 공동체

"객체지향이란 무엇인가?"라는 질문에 뭐라고 답할 것인가? "실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임"입니다. 객체지향 프로그래밍이란 실제로 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이기 때문에, 객체지향 소프트웨어는 실세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화입니다. 이러한 관점을 잘못됐고, 정작 실세계의 모방이라는 개념이 저도 납득이 잘 가지 않았습니다. 왜냐하면 예시를 들어 붕어빵을 제조하는 과정을 객체지향에 빗대어 설명하는데, 저희가 애플리케이션을 개발할 때 붕어빵을 만들진 않기 때문입니다. 그냥 객체지향을 쉽게 이해하기 위한 방안입니다. 또한 객체지향의 목표는 실세계의 모방이 아닌, 실세계의 창조입니다. 시대가 계속 바뀌면서, ..

Java/Java Concept 2023.03.10