본문 바로가기

전체 글326

내부망 프로젝트 - SAP HANA DB & Spring Boot DataBase 를 SAP HANA DB로 이관하면서 HANA DB 실습과 스프링 부트 연동을 했던 과정을 전체는 못담았지만 일부 기록을 남기려고 합니다. 1. HANA DB 실습 VMware 설치 VMware 다운로드 및 설치 방법(feat. VMware Workstation 무료 설치) HANA DB 관련 [무료 SAP HANA 설치하기] 01. 설치 파일 다운로드 및 vmware 준비 [무료 SAP HANA 설치하기] 03. HANA Studio 설치하기 HANA 멀티테넌트 DB - 3. 접속포트 이클립스 설치 하나 스튜디오를 사용하기 위해 이클립스를 활용합니다. HANA Studio Plug-in 설치 이클립스 실행 후 상단 메뉴 Help > Install New Software https://t.. 2024. 1. 10.
스프링부트 API JPA 최적화 페치조인, 페이징 default_batch_fetch_size 페치조인, 페이징 1. 페이징 엔티티 조회 * 선호하는 방법 중 하나 @GetMapping("/api/v3-1/orders") public ResponseEntity orderV3_page( @RequestParam(value = "offset", defaultValue = "0") String offset, @RequestParam(value = "limit", defaultValue = "100") String limit ) { // N 만큼 데이터 나옴 List orders = repository.findAllWithMemberDelivery(offset, limit); // ToOne 관계이기 때문에 페이징 가능 List result = orders.stream() .map(o -> new Ord.. 2023. 12. 23.
스프링부트 API JPA 최적화 (N+1) 컬렉션 조회 최적화, DTO 조회 성능 향상 컬렉션 조회 최적화 1. 엔티티 조회 - 페치 조인으로 쿼리 수 최적화 OrderApiController /** * 페치 조인 */ @GetMapping("/api/v3/orders") public ResponseEntity orderV3() { // N 만큼 데이터 나옴 List orders = repository.findAllWithItem(); List result = orders.stream() .map(o -> new OrderDto(o)) .toList(); return ResponseEntity.ok(new Result(result)); } Order 엔티티 객체로 쿼리 결과를 받아서 Dto 로 변환작업을 한다음 반환 OrderRepository findAllWithItem() public .. 2023. 12. 21.
스프링부트 API JPA 최적화 ToOne 관계 (N+1 문제) , 페치 조인 ToOne 관계 (N+1 문제) , 페치 조인 지연 로딩과 조회 성능 최적화 주문(Order) 내의 ToOne 관계인 member, delivery 지연로딩 조회 Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; // = new ProxyMember()를 생성해서(하이버네이트에서) 넣어둔다. // =.. 2023. 12. 19.
내부망 프로젝트 - Offline 에서 Spring Boot 개발 Maven 레포지토리 새로운 프로젝트에 투입하게 되었습니다. 그래서 요구사항 정의부터 시작하게 되어 23년 12월 말까지 진행하는 프로젝트 입니다. 이번 프로젝트는 보안이 중요한 국가(기관)에서 하는 프로젝트이기 때문에 내부망(폐쇄망)에서 접속가능한 웹포털을 개발하는 프로젝트입니다. 내부망 프로젝트는 처음이라 내부망 환경에서 어떻게 웹포털 프로젝트를 진행하게 되는지 기록하려고 합니다. 내부망 포털, 공유 디스크 등을 사용하려면 해당 담당자 분이 PC에 각종 보안 프로그램을 설치하여 외부망을 쓰지 못하도록 설정하게 됩니다. 그래서 내부망 PC로 전환전에 기존 다른 프로젝트를 실행시켜 메이븐/Gradle repository 파일들을 받아 오거나 프로젝트에 필요한 의존성 파일들을 최대한 받아옵니다. 뿐만 아니라 office, 한글.. 2023. 10. 15.
SQLD SQL 기본 및 활용, SQL 최적화 기본 원리 과목2-1. SQL 기본 SQL 종류 DML SELECT, INSERT, UPDATE, DELETE DDL CREATE, ALTER, DROP, RENAME DCL GRANT, REVOKE TCL COMMIT, ROLLBACK, SAVEPOINT, LOCKING 제약조건 PK - CONSTRAINT PRODUCT_PK PRIMARY KEY (PROD_ID) - ALTER TABLE EMP ADD CONSTRAINT MEP_PK PRIMARY KEY (EMP_NO); UNIQUE KEY - NULL 값을 가질 수 있다. NOT NULL - NULL 과 공백, 숫자 0 은 전혀 다른 값 CHECK - 데이터의 무결성을 유지하기 위하여 테이블의 특정 칼럼에 설정하는 제약 * 데이터 무결성 : 데이터가 전송, .. 2023. 9. 7.
SQLD 데이터 모델링의 이해 , 데이터 모델과 성능 오답노트 과목1-1. 데이터 모델링의 이해 모델링 모델링은 현실세계에 대해서 표현하는 것 모델링은 추상화, 단순화, 정확화 데이터모델링 데이터 관점 업무 분석 기법 약속된 표기법 데이터베이스 구축 위한 분석 설계의 과정 데이터모델링 유의점 중복 중복성 최소화 비유연성 데이터 정의를 데이터의 사용 프로세스와 분리 비일관성 프로그램과 테이블간의 연계성 낮추기 데이터 일관성 데이터모델링 개념적: 추상화 과정 높음 논리적: Key, 속성 등 물리적 스키마구조 외부스키마 개념스키마: 모든사용자 - 통합적 표현 내부스키마 엔티티 두 개 이상의 인스턴스의 집합 (두 개 이상의 속성) 한 개의 속성은 한 개의 속성값 업무 프로세스에 의해 이용 속성 기본 속성 설계 속성 ( 코드성 속성 ) 파생 속성 ( 계산된 값 ) 도메인: .. 2023. 9. 3.
글로벌 영역에서 색상관리 색상관리를 위한 js 파일 생성 colors.js const Colors = { primary500: '#72063c', primary600: '#640233', prmiary800: '#3b021f', accent500: '#ddb52f', primary700: '#4e0329' } export default Colors; 하드코딩 되어 있는 부분에서 사용 return return styles 부분에서의 사용 const styles= StyleSheet.create({ buttonOuterContainer:{ borderRadius: 28, margin: 4, overflow: 'hidden' }, buttonInnerContainer: { backgroundColor: Colors.primary500.. 2023. 8. 16.
게임 화면 작업 - 노치 고려해 SafeAreaView 활용, 제목 컴포넌트 생성 App.js return {/* 노치(카메라부분)에 콘텐츠가 가려지기 떄문에 SafeAreaView 사용은*/} {screen} ; 게임화면인 screen 을 SafeAreaView로 감쌌다. GameScreen.js 게임화면 import React from 'react' import { Text, StyleSheet, View } from 'react-native' import Title from '../components/Title' function GameScreen(props) { return ( 게임 스크린 업 or 다운 ) } export default GameScreen const styles = StyleSheet.create({ screen: { flex: 1, padding: 24 } .. 2023. 8. 15.
리액트네이티브, 화면 전환 StartGameScreen.js function StartGameScreen({onPickNumber}) { const [enteredNumber, setEnteredNumber] = useState(''); function numberInputHandler(enteredText) { setEnteredNumber(enteredText); } function resetInputHandler() { setEnteredNumber('') } function confirmInputHandler() { const chosenNumber = parseInt(enteredNumber); if(isNaN(chosenNumber) || chosenNumber 99) { Alert.alert( '메시지', '입력을 확.. 2023. 8. 14.
리액트네이티브, 입력 검증 StartGameScreen.js import { TextInput, View , StyleSheet, Alert} from 'react-native'; import PrimaryButton from '../components/PrimaryButton'; import { useState } from 'react'; function StartGameScreen() { const [enteredNumber, setEnteredNumber] = useState(''); function numberInputHandler(enteredText) { setEnteredNumber(enteredText); } function resetInputHandler() { setEnteredNumber('') } functi.. 2023. 8. 8.
리액트네이티브, 숫자 맞추기 앱 (커스텀 버튼, 누르기, 배경화면) App.js import { StyleSheet,View } from 'react-native'; import StartGameScreen from './screens/StartGameScreen'; export default function App() { return ; } const styles = StyleSheet.create({ rootScreen: { flex: 1, backgroundColor: '#ddb52f' } }); 앱 화면 구성 StartGameScreen.js import { TextInput, View , StyleSheet} from 'react-native'; import PrimaryButton from '../components/PrimaryButton'; function.. 2023. 8. 7.