분류 전체보기

    [Spring] 회원 관리 예제 01 - 비즈니스 요구사항 정리, domain & repository 생성 → Test code 작성

    🌳 비즈니스 요구사항 정리 데이터 : 회원ID, 이름 기능 : 회원 등록, 회원 조회 DB : 아직 어떤 DB를 사용할지 정해지지 않은 가상의 시나리오 ▪ 따라서 인터페이스로 구현 클래스를 변경할 수 있도록 설계 → 구현체를 통해 가벼운 메모리 기반의 데이터 저장소 사용 ▪ 테스트 프레임워크 → junit 일반적인 웹 애플리케이션 계층 구조 ▪ controller → 웹 MVC의 컨트롤러 역할 ▪ service → 핵심 비즈니스 로직 구현 ▪ repository → 데이터베이스에 직접 접근, 도메인 객체를 DB에 저장하고 관리 → Node에서 사용했던 model과 비슷한 역할이라고 생각하면 될 듯 하다 ▪ domain → 비즈니스 도메인 객체 → 회원, 주문 등등 주로 DB에 저장하고 관리되어지는 객체 ..

    [Spring] 정적 컨텐츠, MVC와 템플릿 엔진, API

    🌳 웹 개발 기초 정적 컨텐츠 서버의 관여없이 파일을 그대로 웹브라우저에 내려주는 컨텐츠 ex) welcome page MVC와 템플릿 엔진 서버에서 프로그래밍하여 동적으로 바꾸어 내려주는 컨텐츠 controller, model, view등의 패턴이 필요 ex) jsp, php API JSON 데이터 포맷을 사용하여 클라이언트에게 정보를 전달하는 방식 🌳 정적 컨텐츠 스프링은 정적 컨텐츠 기능을 자동으로 제공한다 → 원하는 파일을 넣으면 그대로 반환이 된다 hello-static.html 정적 컨텐츠 입니다. [동작 과정] 내장 톰캣서버가 요청을 받아 스프링에게 넘긴다 controller 내에서 hello-static을 찾는다 controller에 없으면 resources에서 hello-static을 찾..

    [Spring] 환경 구축, 라이브러리, thymeleaf 템플릿 엔진 동작 원리

    🌳 프로젝트 생성 java 11 설치 Maven / Gradle Project Maven → pom.xml을 이용하여 정형화된 빌드 시스템을 제공 Gradle → 유연한 범용 빌드 도구 제공 Gradle이 시기적으로 늦게 나온만큼 뛰어난 스펙을 갖고있고, 동적인 빌드 시스템을 xml로 정의하기에는 어려운 부분이 많다 ↔ 요즘은 다들 Gradle로 넘어오는 추세라고 한다. Spring boot Spring boot를 통해 간단하게 프로젝트를 생성할 수 있다. main과 test 디렉토리를 나누는것이 요즘 디폴트 test에는 작성한 코드들에 대한 테스트코드들이 들어가는데, 실무에서 빠질 수 없는 매우 중요한 코드라고 한다. resources에는 설정파일이 위치하는데, java파일을 제외한 모든 파일들이 위치..

    [AWS S3/Node.js] 안드로이드에서 서버로 이미지 전송하기

    지금까지 Aniverse 프로젝트를 진행하면서, 클라이언트 ↔ 서버간 이미지를 전송할 때, 임시로 깃허브 이슈를 통해 생성한 이미지 링크를 전송하는 방식으로 진행했다. (ex. 140559373-3d9b5f13-e1e4-4a51-80ae-b9cdf72769eb.png (474×440) (user-images.githubusercontent.com)) 이번에 사용자 휴대폰의 갤러리에서 직접 사진을 선택하여 서버에 올릴 수 있도록 수정했다. Amazon에서 제공하는 bucket을 이용하였고, 다음 그림은 우리가 개발하고자 하는 방식이다. F) 클라이언트에서 이미지를 얻어 base64 방식으로 인코딩 F → B) base64로 인코딩된 문자열을 서버에게 전송 B) 문자열을 디코딩하여 이미지 얻어내기 얻어낸 이..

    [Database/MySQL] Youtube 유튜브 한방쿼리 작성

    MySQL + Node.js로 Youtube를 따라 만들며 공부했을 때 직접 설계했던 ERD이다. 💡 영상 조회 select v.videoName, v.videoPlus, u.userName, up.userProfile, # (select count(vv.videoViewIdx) as viewNum # from videoview vv left join video v on vv.videoIdx = v.videoIdx # group by v.videoIdx) as viewNum, # 조회수 ifnull(vieww.viewNum, 0) as viewNum, (select count(subUserIdx) from subscription s group by s.userIdx having s.userIdx = ?)..

    [TIL] 2022-01-12

    😊 Today I Learned 로컬호스트에 몽고디비 설치 후 데이터그립 연결고민만 해오다가 드디어 NoSQL을 사용해보게 되었다. 아직은 매우 낯설다😶 수정된 인자들, API의 효율성을 고려하여 데이터베이스 수정없앨 수 있는 테이블들을 삭제하고, 순서대로 테이블에 접근하기 쉽도록 데이터베이스를 대폭 수정하였다.흑.. 이번에 프로젝트를 진행하면서, 데이터베이스를 설계할 때 필요한 칼럼들과 테이블간의 조인 뿐만아니라 함수 내에서 데이터들을 삽입하거나 꺼내올 때 연관된 테이블간의 선후관계또한 고려해주는게 중요하다는것을 깨달았다. Aniverse 몽고디비로 데이터베이스 다시 설계 NoSQL버전 데이터베이스는 임베디드 방식을 사용하여 다른 테이블과의 참조관계를 최소화시키고, 5~6개의 테이블만으로 데이터들을 저..

    [Design Pattern] Command Pattern

    💡 About Command Pattern 커맨드 패턴은 주어진 기능들을 캡슐화함으로써 서로 다른 요청들을 실행할 수 있도록 하는 패턴이다. 간단히 말하자면 객체의 행위(메소드)를 클래스로 만들어 캡슐화하는 패턴인데, A 객체에서 B 객체의 메소드를 실행하려면 B 객체를 참조하고 있어야하는 의존성이 발생한다. → 커맨드 패턴을 적용하면 이런 의존성을 제거하고, 기능들을 수정, 추가할 때 확장성과 유연성이 좋아진다. 💡 Command Pattern Structure Invoker → 기능의 실행을 요청하는 호출자 클래스 Command → 실행될 기능에 대한 인터페이스 실행될 기능을 execute 메소드로 구현 ConcreteCommand → Command 인터페이스 구현 Receiver → Concrete..

    [Design Pattern] Adapter Pattern

    💡 About Adapter Pattern Adapter Pattern은 인터페이스와 인터페이스간의 호환성 문제를 해결해주는 패턴이다. 콘센트에 사용하는 그 어뎁터의 역할과 동일! 호환되지 않는 인터페이스를 사용하는 코드들은 Adapter Class를 만들어 활용할 수 있다. My existing system → Adapter → Vendor class Object Adapter와 Class Adapter로 구현방법이 나누어진다. 인터페이스가 호환되지 않는 문제가 발생해도 Adapter Pattern을 통해 기존의 코드를 수정하지 않고도 문제를 해결할 수 있다. 💡 Adapter Pattern Structure Object Adapter Pattern Client → Target Interface를 요구..

    [TIL] 2021-11-09

    😊 Today I Learned 하루종일 Aniverse API 작성 후 연결 😢 Today's error DB 외래키 제약조건을 위반하여 생기는 에러인데, 테이블들의 관계를 생각하지 않고 값들을 한꺼번에 insert해서 생기는 문제이다. post API를 설계할 때 정보들이 DB에 들어가는 순서와 테이블간의 join관계를 고려하여 insert쿼리를 나누어주어야 한다. adoptController exports.postAdoptUserInfo = async function (req, res) { const {animalIdx, userIdx, contactName, contactPhoneNum, adoptComment} = req.body; try{ var adoptListIdx = await adopt..

    [TIL] 2021-10-11

    😊 Today I Learned Aniverse ERD설계 경소톤에서 구현하게될 "Aniverse"의 디비를 설계해보았다. 17개정도의 테이블을 설계했는데, 이미 출시된 어플을 보고 설계하는게 아니라 어려웠지만 재미있었다. 다시 생각할 부분 앱의 흐름도에 따라 DB에 데이터가 들어갈 순서 다시 생각해서 테이블 수정 MySQL 데이터타입 공부 젤리 지급 알고리즘을 쿼리에 넣을지 js코드에 넣을지 배송지 정보 입력 부분 사진 테이블 (비정형 데이터..) 수정 😢 Today's error 😅 Comment

    [TIL] 2021-10-09

    😊 Today I Learned 1. 자료구조 → 원형 큐, 덱 구현 - 1학기 알고리즘 스터디에서 배운 큐와 덱을 원형 큐 클래스를 통해 직접 구현해보고, 이 클래스를 활용하여 DFS와 BFS 함수도 작성해보았다. 2. key, value 형태의 NoSQL 공부 경소톤 코멘트로 비정형 데이터에 대한 설계는 요즘 유행하는 key-value형태로 설계하는게 어떻겠냐는 의견을 주셔서 알아보았다. 키-값 데이터베이스 ↔ NoSQL NoSQL의 Key-Value Database는 저장과 조회라는 가장 간단한 원칙에 충실한 데이터베이스 테이블간 조인을 고려하지 않는다 → 외래키, 제약조건들이 필요없다. 간단한 데이터 모델을 대상으로 데이터를 자주 읽고 쓰는 어플리케이션에 적합하다. SQL을 사용하면 좋은 경우 관..

    [Design Pattern] Observer Pattern

    💡 About Observer Pattern 옵저버 패턴은 간단히 얘기하자면 어떤 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 디자인 패턴이다. pull → 데이터를 받아온다 push → 데이터를 입력한다 기본적으로 데이터의 변경값을 반영하거나 추가할 때, pull보다 push를 통해 처리해주는게 더 빠르다는 아이디어에서 시작된 패턴 ! One-To-Many Relationship → 하나의 신문사에서 구독자를 계속 수정하고, 추가해준다고 생각하면 쉽다. 💡 Observer Pattern Structure Subject → 신문사 역할, ConcreteSubject의 상위 클래스 subject 객체에서 데이터를 관리한다. 데이터가 달라지면 observer에게 notify를 보낸다. Obs..