본문 바로가기

전체 글640

ALTER 정의:ALTER란? SQL에서 데이터베이스  객체(테이블, 뷰, 인덱스)를 수정할 떄 사용하는 명령어 주요 기능:테이블 구조 변경: 테이블에 새로운 열(Column)을 추가하거나, 기존 열의 데이터 유형을 변경하거나, 열을 삭제하는 등의 작업을 할 수 있다.기타 변경 작업: 인덱스 추가, 기본 키 설정 변경, 제약 조건 추가 등도 가능하다. SELECT * FROM NETFLIX n ; -- 넷플릭스 테이블 전체 조회 --ALTER TABLE NEFLIX ADD (CAST_MEMBER VARCHAR2(20)); -- 새로운 컬럼 추가 --ALTER TABLE NEFLIX MODIFY (CAST_MEMBER VARCHAR2(50)); -- 추가한 컬럼 사이즈 변경 --ALTER TABLE NEFLIX MO.. 2024. 8. 26.
CREATE [주요 SQL 데이터 유형과 그에 해당하는 키워를 정리한 표]데이터 유형키워드설명문자열VARCHAR(n)가변 길이 문자열, 최대 n 글자까지 저장 가능 CHAR(n)고정 길이 문자열, 길이가 부족할 경우 공백으로 채움 TEXT매우 긴 문자열, 길이 제한 없음숫자INT정수 BIGINT아주 큰 정수 SMALLINT작은 범위의 정수 DECIMAL(p, s)소수점이 있는 숫자, p는 전체 자릿수, s는 소수점 이하 자릿수 FLOAT부동 소수점 숫자날짜와 시간DATE날짜 (YYYY-MM-DD 형식) TIME시간 (HH:MM:SS 형식) DATETIME날짜와 시간 (YYYY-MM-DD HH:MM:SS 형식) TIMESTAMP날짜와 시간, 자동으로 현재 시간 기록 가능논리형BOOLEAN참(true) 또는 거짓(fal.. 2024. 8. 25.
테이블 테이블은 데이터베이스에서 정보를 정리해서 저장하는 큰 표 같은 것이다. 이 표는 가로줄(행)과 세로줄(열)로 이루어져 있다.행(Row): 테이블에서 가로로 있는 줄로, 하나의 데이터를 의미한다. 예를 들어, 친구 명단이 있는 표에서는 한 명의 친구에 대한 정보가 하나의 행이 된다.열(Column): 테이블에서 세로로 있는 줄로, 각 열은 특정한 종류의 정보를 나타낸다. 예를 들어, 친구 명단에서 "이름", "나이", "전화번호" 같은 것이 각각 하나의 열이 된다.예를 들어, 친구들의 정보를 저장하는 테이블이 있다고 하면, 다음과 같이 생길 수 있다: 번호이름나이전화번호1철수14010-1234-56782영희13010-8765-4321 2024. 8. 25.
회원 관리 - 프론트) 3. 모든 회원 조회하기 1. 멤버 컨트롤러에 회원 조회 처리 메소드 추가하기@GetMapping("/members")public String list(Model model) { List members = memberService.findMembers(); model.addAttribute("members", members); return "members/memberList";} [작동 방식]1. 리스트에 서비스 메소드인 findMemebers를 이용해 모든 회원을 저장한다.2. model(컨트롤러가 뷰로 데이터를 전달할 때 사용하는 객체)에 members라는 키로 members 리스트를 저장3. 회원 목록화면 렌더링 2. HTML 작성파일 경로: main/resources/templates/member/memb.. 2024. 8. 25.
회원 관리 - 프론트) 2. 회원 등록하기 1. 파일 생성파일 경로: main/java/파일명/Controller/MemberForm 해당 경로로 MemberForm.java를 만들어준다. package section4.section4_spring.controller;public class MemberForm { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }} 해당 파일을 만든 이유는 폼을 들어올 데이터를 처리하기 위해서 이다.  2. 멤버 컨트롤러에 메서드 추가//URL 진입 시 처리될 코드@GetMapping("/members/ne.. 2024. 8. 25.
회원 관리 - 프론트) 1. 홈화면 추가하기 1. 파일 생성파일 경로: main/java/파일명/Controller/HomeController 해당 경로로 HomeController.java를 만들어준다.  2. 홈 컨트롤러 추가package hello.hellospring.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class HomeController { @GetMapping("/") public String home() { return "home"; }} 위의 코드를 간단하게 설명하자면 /라는 경로로 들어오면 home.. 2024. 8. 25.
스프링 빈 등록하기 - 2. 자바코드로 직접 빈 등록하기 컴포넌트를 이용하는 방법은 자동으로 빈을 등록해주는 것이었다. 이번에는 자바 코드로 직접 빈을 등록해보자. ❓왜 자동이 있는데 수동으로 빈을 등록하는가?❓-> 세밀한 제어, 외부 라이브러리 통합 등 복잡하고 특정한 요수사항을 처리할 수 있다는 점이 있다. -> 우리가 수동으로 빈을 등록하는 것을 채택한 가장 큰 이유는 나중에 Repository에서 DB로 쉽게 변경하기 위해서 이다.   1. 자바를 작성할 config 파일 만들기파일 경로: src/main/java/SpringConfig 해당 경로에 SpringConfig 파일을 만든다. 2. 코드 작성하기 package section4.section4_spring;import org.springframework.context.annotation.Bea.. 2024. 8. 25.
스프링 빈 등록하기 - 1. 컴포넌트 스캔과 자동 의존관계 설정 private final MemberRepository memberRepository = new MemoryMemberRepository();기존에 필요한 객체가 있다면 위의 코드와 같이 직접 객체를 만들어와서 사용해왔다.  다만, 이렇게 할 경우 아래의 단점 들이 생기게 된다. 1. 높은 결합도: 클래스들이 서로 강하게 연결되어, 변경이 어려워집니다.2. 유연성 부족: 다른 구현체(클래스)로 쉽게 교체하기 어렵습니다.3. 테스트 어려움: 테스트할 때 실제 객체를 사용해야 하므로 느려지고 복잡해집니다.4. 가독성 및 유지보수성 저하: 코드에서 의존성을 파악하기 어렵고, 관리가 힘들어집니다.5. 재사용성 저하: 특정 상황에 맞게 유연하게 재사용하기 어렵습니다.  따라서 우리는 @Component와 @Au.. 2024. 8. 25.
회원관리 - 백엔드 개발) 4. 회원 서비스 테스트하기 우선 테스트하기 전 조치를 해야할 것이 있다.  MemberService memberService = new MemberService();MemoryMemberRepository memberRepository = new MemoryMemberRepository();우리는 위의 코드와 같이 필요할 때마다 객체를 새로 만들어 주고 있다. 다만 이렇게 되었을 때의 문제 점은 테스트 할 때마다 매번 새로운 객체를 만들면 테스트 간에 공유해야 할 데이터나 상태가 초기화되어 일관성이 없는 결과가 나올 수 있다.  즉, 한 객체에 데이터를 저장한 후 다른 테스트에서 그 데이터를 확인해야 하는데, 객체가 새로 만들어지면 이전 데이터가 사라져서 테스트가 실패할 수 있다.   따라서 우리는 DI(Dependency Inj.. 2024. 8. 25.
회원관리 - 백엔드 개발) 3. 회원 서비스 개발하기 💡 서비스란, 비즈니스 로직을 처리하는 계층을 말한다. 즉, 사용자를 등록하거나 주문을 처리하는 비즈니스 로직 이 여기에 담긴다. 컨트롤러에서 요청을 받으면, 서비스가 일을 처리하고, 필요하면 데이터베이스와 연결해 데이터를 가져오거나 저장한다. 파일 경로: src/main/java/만든 파일명/service(만들어야함)/MemberService package section4.section4_spring.service;import section4.section4_spring.domain.Member;import section4.section4_spring.repository.MemberRepository;import section4.section4_spring.repository.MemoryMemberR.. 2024. 8. 24.
회원관리 - 백엔드 개발) 2. 각각의 repository 메소드 테스트 하기 test폴더를 통해서 테스트를 해보자.파일 경로: test/java/만든 파일명/repository/MemoryMemberRepositoryTest [MemoryMemberRepositoryTest.java]package section4.section4_spring.repository;import org.junit.jupiter.api.Assertions;import org.junit.jupiter.api.Test;import section4.section4_spring.domain.Member;import java.util.List;import static org.assertj.core.api.Assertions.*;class MemoryMemberRepositoryTest { MemoryMemb.. 2024. 8. 24.
회원관리 - 백엔드 개발) 1. 회원 도메인과 Repository 만들기 1. 도메인 만들기💡 도메인이란, 애플리케이션이 다루는 비즈니스 문제 영역과 그 영역을 표현하는 객체들을 의미한다. 파일위치: src/main/java/만든 파일명/domain(직접 만들어야하는 패키지)/Member [Member.java] package section4.section4_spring.domain;public class Member { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; .. 2024. 8. 24.
JSON 데이터를 직접 반환하여, 템플릿을 거치지 않고 API 응답을 처리하기(API 활용하여 개체 JSON으로 반환하기) (파일 경로: src/main/java/hello_spring/controller/HelloController) 특정 경로로 전달된 특정 매개변수 값을 받아 JSON으로 반환하기@GetMapping("hello-api")@ResponseBodypublic Hello helloString(@RequestParam("name") String name){ Hello hello = new Hello(); hello.setName(name); return hello; //객체 반환}static class Hello { private String name; public String getName() { return name; } public void setName(.. 2024. 8. 24.
HTML 페이지 렌더링 시 요청받은 데이터 포함하기(매개변수를 MVC패턴으로 전달해 렌더링하기) 1. MVC 패턴을 이용하여 특정 경로로 들어오는 GET 요청 처리하는 컨트롤러 만들기(파일 경로: src/main/java/hello_spring/controller/HelloController) @GetMapping("hello-mvc")public String helloMvc(@RequestParam("name") String name, Model model){ model.addAttribute("name", name); return "hello-template";}  코드를 하나씩 해석보자. @GetMapping("hello-mvc")-> /hello-mvc 경로로 들어오는 HTTP GET 요청을 처리할 메서드를 지정합니다. public String helloMvc(@RequestPar.. 2024. 8. 24.
HTML 페이지 렌더링 시 고정된 데이터 포함하기(MVC와 템플릿엔진 이용해보기) 1. Welcome Page 만들기 (파일 경로: src/main/resources/static/index.html) 아래의 html을 구성해서 간단한 Welcome Page를 만들어보자.HelloVisit Hello Page  2. MVC 패턴을 이용하여 특정 경로로 들어오는 GET 요청 처리하는 컨트롤러 만들기(파일 경로: src/main/java/hello_spring/controller/HelloController) package hello.hello_spring.controller;import org.springframework.ui.Model;import org.springframework.stereotype.Controller;import org.springframework.web.bind... 2024. 8. 24.
에어컨 절감 어플 - Save on bills 보호되어 있는 글 입니다. 2024. 8. 9.
14.2 포인터 배열 포인터 배열포인터 복습char *ap = "dog";char *bp = "elephant";100 ap ['d'|'o'|'g'|'\\0']  포인터 배열의 예시     포인터를 배열로 만들면 좋은점?→ 반복문 사용으로 여러 포인터에 접근이 가능해진다.→ 즉, 반복문으로 다른 배열 여러 개를 한번 접근할 수 있다.     위의 그림처럼 ap라는 포인터 배열이 있고, 각각 a, b, c라는 배열이 있다고 했을 때 각각 포인터 배열에 각 배열의 시작 주소를 넣으면 아래와 같아진다.   이렇게 포인터 배열이 만들어지면 각각의 다른 배열의 요소에 간단한 반복문을 통해 접근이 가능하다. for(i=0; i 2024. 8. 7.
14.1 다차원 배열 다차원 배열의 형태int score[3][4]라는 다차원 배열을 시각화하면 아래와 같다.[ | | | ][ | | | ][ | | | ]배열명[i][j]은 배열요소가 j개짜리인 배열이 i개 있는 것과 같다.다차원 배열의 주소 100 104 108 112 [ | | | ] 116 120 124 128 [ | | | ] 132 136 140 144 [ | | | ]다차원 배열의 요소[ s[0][0] | s[0][1] | s[0][2] | s[0][3] ][ s[1][0] | s[1][1] | s[1][2] | s[1][3] ].. 2024. 8. 7.
13. 변수 [지역 변수(자유 변수)]→ 일정 지역에서만 사용 가능한 변수특징지역 변수는 사용 범위가 블록 내부로 제한되므로 다른 함수에서는 사용할 수 없다.지역 변수는 이름이 같아도 선언된 함수가 다르면 각각 독립된 저장 공간을 갖는다.장점메모를 효율적으로 사용한다.지역 변수는 함수 내부에서 사용되기 때문에 함수가 반환되면 저장 공간을 계속 유지할 필요가 없다.디버깅에 유리하다.지역 변수는 값에 문제가 있을경우 수정하기 쉽다.주의할 점. 지역 변수가 할당된 저장 공간은 자동 초기화가 안되기때문에 쓰레기 값을 사용하지 않도록 주의해야한다.[전역 변수]→ 프로그램 전체에서 사용가능한 변수→ 함수 밖에서 선언#include assign10();assign20();int a; //1번 aint main() { pri.. 2024. 7. 4.
12.2 문자열 연산함수 [strcpy]→ 문자열을 대입하는 함수strcpy(대입돨 문자열의 베얄명, 대입할 문자열) 🔺 🔺 복사할 곳 복사할 내용 //예시char str1[20] = "apple";strcpy(str1, "mango");문자열은 그 문자열의 주소이다.즉, strcpy 인자는 주소두개를 받아서 실행하는 함수이다. 따라서 아래와 같이 두 번째 인자에 주소인 배열을 넣어서 실행시킬 수 있다.strcpy(대입될 문자열의 베얄명, 대입할 문자열의 베얄명) 🔺 🔺 복사할 곳 복사할 내용 //예시 char str1[20] = "apple";char str2[20] = "man.. 2024. 6. 27.
12.1 문자열과 포인터 컴파일러가 문자열을 처리하는 방식문자열을 별도의 메모리 공간에 따로 저장해둔다.첫 번째 문자의 메모리 공간의 주소를 100이라고 치면 문자열이 사용된 위치에는 100을 치환을 해서 사용한다.이를 증명하는 예시는 아래와 같다.#include int main() { printf("%c", *"apple"); return 0;}//결과//aapple을 간접 참조 연산자를 달아서 출력하면 * (첫 번째 문자 주소) 이와 같이 되기 떄문에 첫 번째 문자인 a가 출력된다.  응용편1#include int main() { printf("%c", *("apple" + 1)); return 0;}//결과//p// [풀이]100 101 102 103 104 105 [ a | p | p | l | l.. 2024. 6. 26.
11.3 getchar(), putchar() putchar()역할: 한 문자를 출력합니다.사용법: putchar(문자);예시: #include int main() { char ch = 'A'; putchar(ch); // 'A'를 출력합니다. return 0;}getchar()역할: 한 문자를 입력받습니다.사용법: 문자 변수 = getchar();예시: #include int main() { char ch = 'A'; putchar(ch); // 'A'를 출력합니다. return 0;}요약putchar(): 한 문자를 출력할 때 사용합니다.getchar(): 한 문자를 입력받을 때 사용합니다.이 두 함수는 문자 단위로 입출력을 처리할 때 유용하며, 특히 간단한 프로그램에서 자주 사용됩니다. 2024. 6. 26.
11-2. 버퍼를 이용하는 입력 함수 scanf 함수가 문자를 입력하는 과정#include int main(){ char ch; int i; for(i=0; i   위처럼 나오는 이유?→ scanf로 데이터를 입력하면 버퍼에 저장한 후 첫 번째 문자만 변수 ch에 저장한다. 또 다음 scanf 함수가 호출되면 두 번째 문자인 i를 변수ch에 저장하고 세 번째도 마찬가지로 g를 저장한다. 그후 저장된 변수를 출력한다.버퍼란? 프로그램 실행 중에 운영체제가 자동으로 할당하는 메모리의 저장공간이다.그렇다면 어떤 입력에도 전부 다 출력해주려면 어떻게 해야할까?#include int main(){ char ch; int i; scanf("%c", &ch); while(ch1!='\n'){ printf.. 2024. 6. 25.
11-1. 아스키코드 [아스키코드]   ‘a’를 컴파일하면 약속된 정수 값인 아스키 코드 값으로 바뀌어 정수 값 97로 아래와 같이 메모리에 저장된다.[ 00000000 | 00000000 | 00000000 | 01100001 ]sizeof('a') //4자 이제는 char형에 문자를 넣고 탐색해보자.char ch; //1bytech = 'a'; // [ 01100001 ] 즉, ch = 97;과 같다.ch = ch + 1; // b소문자를 대문자로 변경 char ch = 'b'; char CH; CH = ch - ('a' - 'A'); // B아스키코드에서 같은 알파벳의 소문자가 대문자보다 32가 크다. 따라서 소문자에서 32를 뺴주면 대문자로 변경이된다.모든 알파벳 출력하기char ch = 'a';while(ch 2024. 6. 25.
AWS Lambda 사용기 근로관련 디스코드 봇을 만들었는데 이 프로그램이 동작할려면 매번 vscode를 실행시켜줘야하다는 문제가 있었다.이 문제를  AWS Lambda로 해결했다. 빠른 요약1. 람다에서 기본 지원하지 않는 외부 라이브러리를 모두 새로운 폴더에 설치2. 해당 폴더에 작성한 코드를 람다에서 사용할 코드로 변경후 저장3. 위의 내용물이 있는 폴더를 zip파일로 압축4. AWS Lambda 함수를 생성5. 위에서 생성한 zip파일을 코드 - 코드소스에 zip 파일로 업로드6. 트리거 추가 후 event bridge 선택7. event bridge에서 cron으로 규칙생성  [전체 코드]import requestsfrom bs4 import BeautifulSoupimport timeimport datetimeimpor.. 2024. 6. 25.