- 102

create data with JPA

DB에 데이터를 기록하려면, 서버에서 데이터베이스에 데이터를 저장해달라고 말해야하는데, 데이터베이스는 자바를 알지 못한다. 이를 위한 도구가 바로 JPA 이다. 즉 JPA는 자바언어를 디비가 이해할 수 있게하고, 데이터관리에 편리한 여러 기능을 제공한다. entity -> 자바 객체를 디비가 이해할 수 있게 규격이고, 엔티티는 리파지토리라는 일꾼을 통해 DB에 전달되고 처리된다( DB table에 처리). 이 과정은 우선, 1. dto를 entity로 변환한다. 기본 프로젝트 안에 entity패키지를 만들고, 그안에 Article이라는 클래스를 만들어준다. @Entity //DB 가 해당 객체를 인식 가능! 엔티티라는 어노테이션을 붙혀줘야 데이터베이스가 해당 객체를 인식가능하다. @Column priva..

Form data 주고받기, JPA로 데이터 생성하기 ( 게시판 만들기 시작 )

지금까지 배운것과 함께 CRUD 정도를 구현할 수 있는 게시판 만들기를 구현해보고자 한다. CREATE 를 위해서 폼 태그를 알아보아야 한다. 에서 어디로 어떻게 보낼지를 적어 전송되고 컨트롤러는 이를 객체에 담아 받는다. 이 때 폼 데이터를 받는 객체를 DTO 라고 한다. 사용자의 입력이 DB 라는 창고에 저장이 되야한다. 우선 데이터를 받아서 확인하는 것부터 연습해보자, templates 안에 article이라는 폴더를 만들어 그 안에 게시판 글을 입력 받는 new.mustache를 작성, 입력폼을 간단하게 만들고, 이를 제어할 수 있는 컨트롤러를 만든다. 부트스트랩으로 간단하게 받아와서 입력창을 만들어주었다. form 태그를 던질 때 두가지를 적어줘야하는데, 어디로 보낼지 / 어떻게 보낼지 이다. ..

MVC 역할과 실행흐름, 뷰 템플릿과 레이아웃

Server => Model / View / Controller 의 유기적 역할을 한다. Controller -> Client 로부터 요청을 받고, View -> 최종 페이지를 만들어주고, Model -> 최종 페이지에 쓰일 데이터들을 뷰에게 전달한다. 결국 요청을 컨트롤러가 받고(GetMapping 을 통해) 메서드를 수행하면서 보여줄 페이지를 리턴한다. 보여줄 페이지에서 사용할 변수는 모델을 통해서 등록한다. 뷰 템플릿은 보통 header / content / footer 로 이루어져있고, 스프링 부트에서는 이를 {{>layouts/header}} titles bodys... Submit {{>layouts/footer}} 이렇게 표현할 수 있다. 여기서 {{}} 안에 파일명을 채워주면 그 파일 전체..

Web service의 동작원리와 View template

웹서비스는 기본적으로 클라이언트(컴퓨터)와 서버(서비스 제공프로그램)의 요청(request)과 응답(response)으로 이루어진다. localhost:8080 여기서 localhost 는 주소를 의미한다.( 내 컴퓨터의 주소) 8080 은 port 번호인데, 방 정도로 해석하면 된다. 즉 우리집의 8080 방으로 연결하겠다는 것을 의미하고 Tomcat started on port 8080 은 이 스프링이 8080에서 실행된다는 것을 의미한다. 만약 localhost:8080/hello.html 이라고 작성하면 이 스프링은 기본적으로 src -> main -> resources -> static 에서 파일을 찾는다. 그 안에서 'hello.hmtl'의 파일을 찾아 응답해준다. View Templates ..

Spring boot, 개발환경 세팅

우선 자바 웹 프레임워크를 처음 써보는데, spring이 아닌 바로 spring boot를 하는게,, 맞는지는 모르겠지만,,,! 열심히 배워 base를 익혀나가고자 한다. 개발환경은 세팅에 있어 총 3가지가 필요했다. JDK / Intellij / Spring boot 모두 설치하여, 기본 프로젝트(?) 의 구조를 파악하였고, src -> main -> java -> project class(기본 패키지) 안에 controller 패키지를 만들어주었다. 이 패키지 안에 컨트롤러라는 자바 패키지를 만들어 mustache 페이지를 볼 수 있도록 연결해주는 코드를 작성해준다. @------ 는 식으로 작성을 하면 알아서 import 해주는 식으로 동작이 되고, 메서드에 리턴값으로 mustache파일의 이름만 ..

Compiled language vs Interpreted language

오늘 회사에서 팀장님이 OJT 를 해주시는데, C, C++, Java. / Python, Javascript 의 차이에 대해서 물어보셨다. 다 아는 언어들인데, 막상 두가지 차이에 대해 답하려니까 쉽지가 않았다. 뭔가 strict한 언어와 유연한 언어로 나뉜거 같기도 하고, 또 C가 묶여있는 것을 보니 객체지향 절차지향으로 나뉜거 같지는 않고,,, 결국 답을 못했고, 이 둘의 차이는 컴파일언어와 인터프리트 언어이다. 컴파일 언어란, 소스코드 전체를 기계어로 번역한 후(컴파일) 이 기계어를 cpu를 통해 실행하는 방식으로 동작한다. 반대로 인터프리트 언어는, 소스 코드를 컴파일 하지 않고, 인터프리터를 통해 한줄 씨 번역하며 실행하는 방식으로 동작한다. 컴파일 언어의 경우, 실행 시에는 실행만 하면 되므로..

CS/필수지식 2022.06.21

로그인 / 회원가입 구현해보기 (7) DB를 사용하여 로그인/회원가입 구현

이전까지 DB없이 JSON 파일형태로 로그인 / 회원가입을 구현해보았다. 여기까지도 나름대로 WAS에 속하고, 의미있는 작업이지만 매번 좀 더 제대로 된 시스템을 위해 AWS의 RDS를 이용하여 MYSQL 데이터베이스를 만들었고, 이를 연동해서 사용하고자 한다. 먼저 db.js를 통해 데이터베이스를 설정해줘야한다. npm i -s mysql 명령어를 통해 mysql을 설치해주고, db 변수를 만들어(mysql.create.Connection) 호스트와 유저 패스워드 데이터베이스명을 설정해준 뒤, 연결해주고 export 해주면 외부에서 이 데이터베이스를 사용할 수 있게 된다. const mysql = require("mysql"); const db = mysql.createConnection({ host:..

Back-end/Node.js 2022.06.13

공주 구하기 (덱, 큐 )

큐 관련해서 쉬운 문제인데, 분명 유명한 테이블 문제인데 이름이 생각이 안난다... 무슨... 용어가 있는데 이름이 생각이 안나서 너무 괴로운 문제였다. 여튼 문제 풀이는 간단하다. 명수만큼 덱에 넣어준 뒤, while 문을 덱 안에 마지막 한 사람만이 남을 때 까지 돌려준다. 그리고 경우를 cnt로 추적하며, 이 cnt가 K의 배수가 될 때는 이를 리스트에서 삭제시키고, (popleft()) 그 외 나머지 경우네는 popleft()를 해서 그대로 다시 오른쪽에 append 시키고, 이 반복문을 계속하다보면 최후의 왕자가 남게된다. import sysfrom collections import deque#sys.stdin=open("input.txt", 'rt')N, K = map(int, input()...

Web Server 와 WAS 의 차이

통상 웹서버라고 하면 그냥 WAS구나 라고 생각하는 경우가 많다. 하지만 Web Server와 WAS를 둘다 사용한다 => 이럴때 구분해서 이야기한다. Web server 는 쉽게 말해서 Client에서 요청이 들어오면 정적인 것들만 전달을 해주는 역할 조금 더 자세히 말해서, 브라우저 클라이언트로부터 HTTP 요청을 받고, 정적인 컨텐츠들(html, css 등)을 제공하는 서비스 프로그램이다. Apache Server 또한 이 웹서버에 포함된다. 그렇다면 WAS(Web Application Server)는 어떤 역할을 하는 것일까? Nodejs에서 로그인/회원가입을 구현할 때도 그렇고 DB를 건드릴 때 등, 어떠한 로직을 처리가 요구되면 동적 컨텐츠를 제공하기 위해 만들어지는 것이 바로, 이 WAS 이..

Web Development 2022.06.12

가장 큰 수 (스택)

먼저 처음 포인트는 이 숫자들을 리스트에 받아줘야하는데, 띄워쓰기로 구분되어있지 않기 때문에 항상 받아왔던 방식인 map(int, input().split()) 방식으로 받을 수가 없다. 그래서 str로 받아서 이것들을 list에 넣는뒤, 다시 int형으로 변환시켜준다.  b_num, delete = map(int, input().split())nums = []for i in range(len(str(b_num))):    nums.append(str(b_num)[i])nums = list(map(int, nums)) 그 후, 새로운 리스트를 만들어 nums에 있는 수들을 끄집어 내며 하나씩 비교해보고, 새로운 리스트에 들어있는 수보다 nums[0]에 들어있는 수가 크다면 이를 빼주고, 삭제할 수 있는 ..