Posts
해당 년도의 글은 티스토리 블로그에 있습니다.
티스토리 블로그 방문Transaction과 Lock
Transaction과 Lock 트랜잭션과 격리 수준 트랜잭션은 ACID라는 원자성, 일관성, 격리성, 지속성을 보장해야 한다. ▼ 원자성 (Atomicity) ▼ 일관성 (Consistency) ▼ 격리성 (Isolation) ▼ 지속성 (Durability) 낙관적 락과 비관적 락의 기초 낙관적(Optimist...
SQL 튜닝 2장 - 튜닝 용어를 직관적으로 이해하기
2.1 물리 엔진과 오브젝트 2.1.1 DB엔진 용어 사용자는 DB에서 원하는 데이터를 가져오고자 SQL문을 실행한다. 실행된 SQL 문은 MySQL 엔진에서 문법 에러가 있는지, DB에 존재하는 테이블 대상으로 SQL문을 작성했는지와 같은 세부 사항을 다양한 문법 및 구문으로 검사한다.(파싱 작업을 하는 parser 역할) 이후 사...
SQL 튜닝 1장 - MySQL과 MariaDB 개요
MySQL과 MariaDB 개요 구조적 차이 ▶︎ 오라클 DB 오라클의 경우에는 아래의 이미지와 같이, 통합된 스토리지 하나를 공유(shared everything)하는 방식을 사용한다. 이렇게 공유 스토리지를 사용하기 때문에 사용자가 어느 DB 서버에 접속하여 sql 문을 수행하여도 같은 결과를 출력하거나 동일한 구문(SELECT, I...
MVCC
MVCC MVCC란? MVCC는 Multi Version Concurrency Controll의 약자이다. MVCC는 동시 접근을 허용하는 데이터베이스에서 동시성을 제아하기 위해 사용하는 방법 중 하나이다. MVCC에서 데이터에 접근하는 사용자는 접근한 시점에 데이터베이스의 Snap-Shot을 읽는다. MVCC 데이터베이스가 데이터의 업데...
Reactive Streams
Reactive Programming Reactive Programming의 배경 예를 들어 A는 시간이 항상 궁금하지만, 시계를 볼 줄 모르는 사람이라고 해보자. A가 B에게 지금 몇시인지 물어본다. B는 시계가 없어서 C에게 다시 물어본다. C는 본인이 하던 일을 마무리하고 B에게 시간을 알려준다. B는 C에게서 들은 ...
Circuit Breaker Pattern
resilience4j resilience4j란? ▶︎ 망나니 개발자 - Resilence4J란? 위 블로그 글을 요약을 해 보면 아래와 같다. Hystrix는 넷플릭스에서 만든 비슷한 기능을 하는 오픈소스인데, deprecated되었다. Resilience4J를 적용하면 외부 서비스에서 장애가 발생하여도 자신의 시스템에 장애가 전파...
Circuit Breaker Pattern 적용
Circuit Breaker Pattern 적용 @CircuitBreaker 오늘은 애노테이션 기반으로 Circuit Breaker를 적용해보는 시간을 가졌다. @GetMapping("/") @CircuitBreaker(name = "", fallBackMehtod = "") public void testMethod() { //... ...
Transactional 애노테이션과 Rollback
@Transactional과 rollback의 관계 문제의 코드 @Transactional public void attemptPasswordAuth(String email, String inputPassword) { //... 생략 if (!passwordEncoder.matches(inputPassword, account.get...
ThreadLocal
Thread Local 이전의 문제점 스프링에서 필드 동기화시 동시성 문제를 만날 수 있다. 왜냐면 스프링부트는 싱글톤으로 컨테이너에 빈을 등록하기 때문이다. 만약 A라는 싱글톤 빈에 여러 요청이 동시에 들어왔을 때, 특정 필드에 여러 쓰레드가 동시에 접근할 수 있기 때문이다. ThreadLocal 이해하기 ThreadLocal은 ...
스프링과 문제 해결 - 트랜잭션
스프링과 문제 해결 - 트랜잭션 발생한 문제를 파악하기 스프링을 사용하지 않고 개발을 할 때는 아래와 같은 문제가 발생한다. 트랜잭션 문제 예외 누수 문제 JDBC 반복 문제 [ 트랜잭션 문제 ] 가장 큰 문제는 트랜잭션을 적용하면서 생긴 다음과 같은 문제들이다. 트랜잭션을 적용하기 위해 JDBC 구현 기술이 서비...
JDBC
JDBC 이해 JDBC의 등장 이유 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야 한다. 또 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL전달, 그리고 그 결과를 응답 받는 방법을 새로 학습해야한다. 이런 문제를 해결하기 위해 JDBC라는 자바 표준이 등장한다. ...
Spring에서 비동기처리
들어가기 앞서 오늘 회사에서 Spring 내에서 비동기로 로직을 처리하는 소스를 분석하였다. 내부적으로 publish-subscribe 패턴을 사용하고 있었다. 사실 나는 이 개념을 잘 모른다. 결과적으로 소스를 분석하는데 있어 많은 시간을 사용하였다. 물론 주변의 도움으로 분석은 완벽하지는 않지만 이해하는 정도로 마무리하였다. 암튼 이번...
SSH 사용하여 git clone하기
clone repo using SSH key 자동화 Script #!/bin/bash read -p "Enter your Git-Hub Email: " email read -p "Enter secure algorithm (rsa or ed25519): " algo # check directory SSH_DIRECTORY=~/.ssh ...
제8장 - 경계
들어가기 앞서 로버트 C 마틴 - 클린코드 8장 목표 • 책을 그대로 정리하지 않기. • 책 내용을 참고하여 이해하기 쉽게 정리하기. 목차 • 외부 코드 사용하기 • 어뎁터 패턴 경계 외부 코드 사용하기 [ ▾ 이해하기 ] 이 책에서는 Map 인터페이스를 예시를 들어 설명을 해주었다. 그러나 현재 지금 시...
제7장 - 오류처리
목차 로버트 C 마틴 - 클린코드 7장 정리 • 오류 코드보다 예외를 사용하라. • Try-Catch-Finally • Unchecked 예외를 사용하라. • wrapper 클래스를 정의하라. • 정상 흐름을 정의하라. • null을 반환하지 마라. • null을 전달하지 마라. 오류 처리 오류처리 코드로 인해 프...
제6장 - 객체와 자료구조
목차 로버트 C 마틴 - 클린코드 6장 정리 • 객체와 자료구조 • 디미터 법칙 객체와 자료구조 자료 추상화 [책 내용] 자료를 세세하게 공개하기 보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하...
Map Interface
Map Interface HashMap 예제 코드 public static void main(String[] args) { Map<String, String> mapTest = new HashMap<>(); mapTest.put("Facebook", "USA5"); mapTest.put(...
Trade Market - 인프라 구축
들어가기 앞서 최근에 Docker, AWS, Git Action을 사용해서 CI/CD 구축을 진행했다. 이번 포스팅에서는 해당 과정에서 습득한 새로운 지식들, 그리고 과정에서 마주친 각종 에러들을 어떻게 해결했고, 왜 에러가 발생했는지 꼼꼼히 기록해보려고 한다. 목차는 다음과 같다. AWS EC2, RDB Git Submodu...
대칭키 vs 비대칭키
Http vs Https 둘의 차이점 이 둘의 가장 큰 차이점은 보안으로 볼 수 있다. Https의 경우에는 SSL(Secure Socket Layer)을 이용해서 클라이언트의 민감한 정보들을 암호화 및 복호화 해준다. 그렇다면 Https는 어떤 방식을 사용해서 정보들을 안전하게 지켜주는 것일까? 오늘은 Https의 암호화 및 복호화 ...
Dependency LookUp
DL(Dependency LookUp) DL이란? Dependecy LookUp은 DI와 반대로 스프링 컨테이너에 등록된 빈을 찾는 것을 말한다. ApplicationContext에서 제공해주는 getBean() 메소드를 통해서 DL을 할 수 있다. 예시 코드 AnnotationConfigApplicationContext ac = ...
내부클래스
내부클래스 내부클래스란? 내부 클래스란 클래스 내에 선언된 클래스이다. 클래스 내에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다. 내부 클래스는 외부 클래스를 제외하고 다른 클래스에서 잘 사용되지 않는 것이여야 한다. class Line { public int line = 100; // 내...
깊은복사, 얕은 복사
얕은 복사 얕은 복사란? 얕은 복사(Shallow Copy)는 주소값을 복사 한다는 의미이다. 예제로 살펴보기 public class ShallowCopy { public static void main(String[] args) { User user1 = new User("gilbert"); Use...
JVM이란?
Java Virtual Machine JVM이란? Java는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 Java를 실행 시킬 무언가가 필요한데, 그게 바로 JVM이다. 즉, OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상의 컴퓨터이다. JVM, 왜 필요할까? Ja...
Service 계층 - File 테스트
File mocking하기 MockMultipartFile MockMultipartFile은 MultipartFile 인터페이스를 상속받는다. package org.springframework.mock.web; public class MockMultipartFile implements MultipartFile { privat...
Service 계층 - Static 클래스 테스트
Static 클래스 mocking하기 MockedStatic mockito docs : Interface MockedStatic Mocking은 이 정적 모의가 생성된 스레드에만 영향을 미치며 다른 스레드에서 이 개체를 사용하는 것은 안전하지 않다. 따라서 close() 메소드를 호출해서 자원을 해제해줘야 한다. 그렇지 않으면 정적...
InvalidDefinitionException 오류
InvalidDefinitionException 에러를 마주치다. 에러 메세지 [ 원문 ] com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyIn...
Repository 계층 테스트
기본 설정 사용하는 어노테이션 설명 [ @DataJpaTest ] JPA 구성 요소에만 초점을 맞춘 JPA 테스트에 대한 어노테이션이다. 이 어노테이션을 사용하면 전체 자동 구성이 비활성화되고, 대신 JPA 테스트와 관련된 구성만 적용된다. 기본적으로 해당 어노테이션이 달려있는 테스트는 트랜잭션이 이루어지며, 각 테스트가 끝날 때 롤백된다...
NAT, NAPT
NAT(Network Address Translation) NAT란? 보통 가정에서는 프라이빗 IP어드레스를 사용한다. 하지만 프라이빗 IP는 가상의 주소라 퍼블릭 IP를 사용하는 서버와의 통신을 불가능하다. 그래서 이때 NAT기술이 사용된다. NAT 기술은 프라이빗 IP어드레스 와 퍼블릭 IP어드레스 간의 변화 외에도 IPv4와 IPv6 ...
IPv4와 IPv6
IPv4 IPv4란? IPv4(Internet Protocol Version4)는 네트워크에 연결된 컴퓨터를 식별하기 위해 32비트의 IP 어드레스가 사용된다. IPv4헤더 ▷ 생존 기간(TTL, Time To Live) IP 패킷에도 유통기한이 있어, 헤더에 생존기간(TTL)을 설정해주면 그 기간 내에 패킷이 전달이 되지 않고...
라우터와 라우팅
Router(라우터) 라우터란? 데이터를 목적지까지 전달하기 위해서는 라우터라고 하는 네트워크 장비가 필요하다. 라우터는 네트워크와 네트워크를 연결하는 역할을 하는데, 하나의 라우터는 데이터를 목적지까지 전달하기 위해 다음 네트워크의 경로를 찾고, 그 경로상에 있는 라우터에게 데이터 전달을 위임하게 된다. 라우터의 역할 라우터의 역...
GSON, JSONObject, ObjectMapper
GSON Gson이란? Gson은 Java 객체를 JSON 표현으로 변환하는 데 사용할 수 있는 Java 라이브러리이다. 뿐만 아니라 JSON에서 Java 객체로도 변환을 할 수 있다. 이 블로그에 Gson 관련해서 잘 정리되어 있다. JAVA Object → JSON public static String loginSuccessMes...
Trade Market - DB 설계
요구사항 명세 회원가입 • 회원 가입 정보는 AGENT 테이블에 등록한다. • 회원 가입시 필요한 정보는 아래와 같다. - 프로필 이미지 - 이름 - 소속 에이전시 - 경력기술 - 이메일 - 연락처 - 비밀번호 - 등록일자 - 수정일자 • 이메일 중복은 허용하지 않는다. 프로필 이미지(PROFILE_IMG) • 이미지 파일은 PR...
EntityManager
EntityManager란? EntityManager란 엔티티 매니저는 엔티티를 저장하고, 수정하고, 삭제하고, 조회하는 등 엔티티와 관련되 모든 일을 처리한다. 이름 그대로 엔티티를 관리하는 관리자다. EntityManager & EntityManagerFactory EntityManagerFactory는 이름 그대로 Enti...
스프링 데이터 JPA와 Querydsl
스프링 데이터 JPA → Querydsl (페이징) 사용자 정의 Repository 생성 방법은 어렵지 않다. 별도의 Repository를 생성해서 스프링 데이터 리포지토리에 사용자 정의 인터페이스를 상속하면 된다. @Repository public interface MemberRepository extends JpaRepo...
순수 JPA와 Querydsl
JPAQueryFactory 스프링 빈 등록 별도의 Config파일 만들어서 등록하기 @Configuration public class QuerydslConfig { @PersistenceContext EntityManager em; @Bean public JPAQueryFactory jpaQueryFactory() {...
중급 문법 - Part3
수정, 삭제 벌크 연산 앞선 학습 내용에서도 정리했지만, 벌크 연산을 하게 되면 영속성 컨텍스트와 DB의 상태를 동일하게 만들어줘야 한다. 따라서 벌크 연산을 하고 난 후에는 반드시 flush와 clear를 해줘야 한다. 쿼리 한번으로 대량 데이터 수정 하나의 쿼리로 여러 건의 row를 수정할 수 있다. @Test @Display...
중급 문법 - Part2
동적쿼리 BooleanBuilder 사용 BooleanBuilder 클래스를 사용하는 방식이다. @Test @DisplayName("동적쿼리 : BooleanBuilder") public void test1() { String usernameParam = "member1"; Integer ageParam = 10; ...
중급 문법 - Part1
프로젝션과 결과 반환 - 기본 프로젝션 대상이 하나 프로잭션 대상이 하나면 타입을 명확하게 지정할 수 있다. List<String> result = queryFactory .select(member.username) .from(member) .fe...
기본 문법 - Part2
조인 기본 조인 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 Q타입을 지정하면 된다. join(조인 대상, 별칭으로 사용할 Q타입) • join(), innerJoin() : 내부 조인 • leftJoin() : left 외부 조인 • rightJoin() : right 외부 조인...
기본 문법 - Part1
들어가기 앞서… Querydsl란? • Querydsl은 JPQL 빌더 오류 시점 파라미터 JPQL 실행 시 직접 바인딩 Querydsl 컴파일 시 자동 바인딩 ...
확장 기능
사용자 정의 리포지토리 구현 언제 쓸까? 스프링 데이터 JPA 레포지토리는 인터페이스만 정의하고, 구현체는 스프링이 자동 생성해준다. 그렇다면 개발자가 직접 이를 구현하면 안되는 걸까? 해도 되긴하지만 구현해야 하는 기능이 너무 많아지게 된다. JPA 직접 사용하거나, 스프링 JDBC Template, MyBatis, Querydsl ...
읽기 전용 쿼리의 성능 최적화
읽기 전용 쿼리의 성능 최적화 엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 얻을 수 있는 혜택이 많다. 하지만 영속성 컨텍스트는 변경 감지를 위해 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 있다. 이런 단점들을 극복하여 최적화하는 방법을 알아보자. 스칼라 타입으로 조회 가장 확실한 방법은 엔티티...
엔티티 구별
병합(merge) 병합(merge)이란? 우선 병합에 대해서 제대로 이해하고 있어야 한다. 병합(merge) 정리 포스팅에 정리해뒀다. 새로운 엔티티를 판단하기 기본 판단 전략 • 식별자가 객체일 때 null로 판단 • 식별자가 자바 기본타입(primitive type)일 때 0으로 판단 • Persistable 인터페이스를 ...
구현체 분석
스프링 데이터 JPA 구현체 분석 SimpleJpaRepository 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체이다. SimpleJpaRepository를 자세히 살펴보자. @Repository @Transactional(readOnly = true) public class SimpleJpaRepository<T, ID&...
쿼리 메소드 기능
메소드 이름으로 쿼리 생성 순수 JPA public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) { String jpql = "select m from Member m" + " where m.username = ...
API 개발 고급 - 실무 필수 최적화
OSIV Open Session In View OSIV는 영속성 컨텍스트를 뷰까지 열어 둔다는 뜻이다. 영속성 컨텍스트가 살아 있으면 엔티티는 영속 상태로 유지된다. 따라서 뷰에서도 지연로딩을 사용할 수 있다. 참고로 Open Session In View는 하이버네이트에서 사용하는 용어이고, JPA에서는 Open EntityManag...
JPA를 활용해서 기본적인 API 만들기
회원등록 API 만들기 V1 : 요청 값으로 Member 엔티티를 직접 받기. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long join = memberService.join(memb...
API 개발 고급 - 컬렉션 조회 최적화
컬렉션 조회 최적화 V1: 엔티티를 직접 노출 @GetMapping("/api/v1/orders") public List<Order> ordersV1() { List<Order> all = orderRepository.findAll(new OrderSearch()); for (Order order : all)...
API 개발 고급 - 지연로딩과 성능 최적화
지연 로딩과 조회 성능 최적화 V1: 엔티티를 직접 노출 @GetMapping("/api/v1/simple-orders") public List<Order> ordersV1() { List<Order> all = orderRepository.findAll(new OrderSearch()); for (Order...
변경감지와 병합
변경감지와 병합 준영속 엔티티 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. 임의로 만들어낸 엔티티도 기존 식별자를 가지고 있으면 준 영속 엔티티로 볼 수 있다. ▷ 준영속성 정리 포스팅 준영속 엔티티를 수정하는 2가지 방법 ▷ 변경 감지(Dirty Checking) 기능 사용 @Transactional public voi...
생성자 패턴
생성자 패턴 점층적 생성자 패턴, 자바빈 패턴, 빌더 패턴에 대해 정리된 블로그. 🔖 블로그 - 1 🔖 블로그 - 2
엔티티 설계시 주의사항
엔티티 설계시 주의사항 엔티티에는 가급적 Setter를 사용하지 말자 setter가 모두 열려있다면 변경 포인트가 너무 많아서 유지보수가 어렵다. 모든 연관관계는 지연로딩으로 설정! 즉시로딩(EAGER)는 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제 가 자주 발생한다. 결국 실무에서...
벌크 연산
벌크 연산 왜 사용할까? 만약 재고가 10개 미만인 모든 상품의 가격을 10% 상승한다고 해보자. 그러면 JPA는 더티체킹을 통해 10개의 SQL문을 내보낼 것이다. 그러나 10개가 아니고 100만건이라면? 너무 많은 SQL로 인해서 성능 이슈가 생길 것이다. 이런 문제를 해결하기 위해서는 벌크 연산을 사용해야 한다. • 애플리케이션 로...
Named 쿼리
Named 쿼리 특징 • 미리 정의해서 이름을 부여해두고 사용하는 JPQL • 정적쿼리에서만 사용할 수 있다. • 어노테이션, XML에 정의 • 애플리케이션 로딩 시점에 초기화 후 재사용 • 애플리케이션 로딩 시점에 쿼리를 검증 사용방법 ▷ 어노테이션 설정 @NamedQuery( name = "Member.find...
Thread Management
스레드 프로세스와 스레드 프로세스가 하는 일은 능동적인 개체로써 실행 중에 각종 자원을 요구, 할당, 반납 그리고 제어하며 작업을 완료하는 것이다. 즉, 자원을 제어하여 작업을 완료한다. 여기서 제어 부분만 따로 분리해 놓은 것을 쓰레드(Thread) 라고 부른다. 그리고 하나의 프로세스 내에서는 여러개의 쓰레드가 존재할 수 있다. ...
Process Management
Job Vs Process 비교하기 ▷ Job Job이라는 것은 우리가 짠 프로그램과 그 프로그램이 처리하는 데이터를 묶어둔 것이다. 간단하게 프로그램이라고도 부른다. 이 Job은 현재 디스크에 보관되어 있는 상태를 말하며, 컴퓨터 시스템에서 실행하려고 요청하기 전의 상태이다. ▷ Process 프로세스란 실행을 위해 시스템(커널...
응용계층
응용계층 응용계층이란? 응용계층에는 OSI 참조 모델의 세션 계층과 표현 계층이 포함된다. TCP/IP 모델의 응용 계층에 포함되어 있는 프로토콜과 프로그램은 원격으로 컴퓨터 자원에 접속하는 데 사용된다. 응용 프로그램을 통해 제공되는 서비스는 표현 계층과 세션 계층에 정의되어 있다. 응용 계층은 파일 전송, 데이터베이스 ,원격 접속...
JPA - 구동방식
JPA - 구동방식 JPA를 쓰기전 필요한 설정 1. persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi=...
JPQL 중급문법 - Fetch Join
Fetch Join 실무에서 엄청엄청 중요하다!!! Fetch Join이란? • 객체 그래프를 하나의 SQL로 조회하는 개념 • SQL의 조인 종류가 아니다. • JPQL에서 성능 최적화 를 위해 제공하는 기능이다. ▷ N + 1 문제 • 연관된 엔티티나 컬렉션을 하나의 SQL로 함께 조회하는 기능 • join fetch 명령어 사용 ...
DispatcherServlet
DispatcherServlet 이전 이야기 이전 포스팅에서 CGI와 Servlet에 대해서 자세하게 공부했다. 이번에는 Servlet 인터페이스를 구현한 Spring MVC의 핵심인 DispatcherServlet에 대해서 자세히 살펴볼 예정이다. DispatcherServlet이란? DispatcherServlet도 Servlet...
Servlet
CGI CGI란? CGI(Common GateWay Interface)는 공용 게이트웨이 인터페이스의 약어로, 웹 서버와 응용 프로그램간의 통신을 위한 프로토콜이다. 웹 브라우저로 부터 수신한 요청에 실린 정보를 어떻게 Application에 전달할 것이며, 또 Application에서 받은 응답 결과를 어떻게 웹 서버가 수신할 것인지에 ...
Aop 사용 시 HttpServletRequest 접근하기
HttpServletRequest 접근하기 접근 방법 stackoverflow에서 찾은 답변이다. 모든 요청에서 DispatcherServlet은 현재 HttpServletRequest를 RequestContextHolder의 정적 ThreadLocal 개체에 바인딩한다. HttpServletRequest request ...
커멘드 패턴
커멘드 패턴 헤드퍼스트 디자인패턴 - 커멘드 패턴 내용 정리. 호출 캡슐화하기 캡슐화를 더 높은 수준으로 끌어올려보자! 메소드 호출을 캡슐화하면 계산 과정의 각 부분을 결정화할 수 있기에 계산하는 코드를 호출한 객체는 그 일이 어떤 식으로 처리되는지 전혀 신경 쓸 필요가 없다. 그냥 결정화된 메소드를 호출해서 필요한 일만 ...
정적클래스와 Bean
Static(정적) Static에 대해서 알아보자 언제 static을 붙일까? 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다. 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적이기 때문에 서로 다른 값을 유지한다. 경우에 따라서는 각 인스턴스들이 공통적으로 같은 값을 가져야하는 경우가...
Value 어노테이션
@Value @Value 란? @Value 어노테이션은 properties 파일에 세팅한 내용을 변수에 주입하는 역할을 한다. 실 사용 해보기 우선 application.properties에 아래와 같이 값을 정의해야 한다. // application.properties cookie.name=mySessionId 그리고 @Value...
쓰레드
들어가기 앞서. 이미지 업로드시 속도 문제와 만나다. 기존의 이미지 업로드의 경우 아래와 같이 작동한다. 이미지 업로드 클릭 → 썸네일 생성 + 이미지 업로드 (이미지 갯수만큼 반복) 그러나 여기에는 치명적인 단점이 있었다. 용량이 큰 이미지 파일의 갯수가 30개, 40개 혹은 그 이상일 경우에는 업로드 속도가 눈에 띄게 느려졌기 ...
싱글톤 패턴
싱글톤 패턴 단순하지만 구현하기는 까다롭다! 싱글톤 패턴이란? 정의 : 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공한다. 싱글톤 패턴이란, 특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해 주는 패턴이다. 싱글톤 패턴을 사용하면, 전역 변수를 사용할 때와 마찬가지로 객체 인스턴스를 어디서든지 엑세...
영역 구하기
문제 파악 문제 🔖 백준(실버1) - 영역 구하기 백준(실버1) - 그림 과 유사한 문제이다. 주요 조건 • 이번 문제는 분리된 각 영역의 면적과 그 갯수를 구하는 문제이다. 아이디어 우선 주어진 좌표 x1, y1, x2, y2 를 가지고 인접행렬을 만들어야 한다. 넓이에 포함된 좌표는 1로 나타내고 그렇지 않은 영역은 0으로...
숨바꼭질
문제 파악 문제 🔖 백준(실버1) - 숨바꼭질 주요 조건 • 아이디어 현재 지점에서 -1, x2, +1 한 값을 큐에 넣어준다. 문제 해결 과정 핵심 로직 • 해결 순서 ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ 소스 코드 🔖 소스 코드
특정 거리의 도시 찾기
문제 파악 문제 🔖 백준(실버2) - 특정 거리의 도시 찾기 이번 문제는 트리의 부모 찾기와 비슷한 유형의 문제이다. 두 문제 모두 해당 노드의 부모노드를 사용해서 해결하는 문제이기 때문이다. 이번 문제는 조금은 심화? 된거 같다. 주요 조건 • 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다. • 최단 거리가 K인...
그림
문제 파악 문제 🔖 백준(실버1) - 그림 아이디어 그래프를 순회하면서 노드의 값이 1이면서 방문한적 없는 곳부터 탐색을 시작한다. 이동할 때, 그림의 크기를 알기 위해 다음 노드로 이동시 count에 1을 더하면서 이동한다. 그리고 탐색이 종료되면, 그림의 크기를 List에 저장한다. 이렇게 모든 노드의 탐색을 종료하게 되면 Li...
팩토리 패턴
변화 new 연산자 new연산자가 눈에 띈다면 ‘구상’을 떠올리자. new를 사용하면 구상 클래스의 인스턴스가 만들어진다. 당연히 이 방법은 인터페이스가 아닌 특정 구현을 사용하는 것이다. 그런데 구상클래스 바탕으로 코딩을 하면 유연성이 떨어진다고 했다. 그렇다면 new를 사용하지 않는게 맞지 않을까? 라는 생각은 했지만, 자바에...
촌수 계산
문제 파악 문제 🔖 백준(실버2) - 촌수 계산 아이디어 주어진 두 정점 사이의 촌수를 구해야 한다. 따라서 두 정점중 하나를 탐색 알고리즘의 시작노드로 지정해야 한다. 그리고 남은 하나의 노드를 도착노드로 정해줘야 한다. 또한, 자식노드로 이동할 때 (즉, Depth가 들어갈 때) depth를 카운팅 해주는것이 필요하다. 문제에서...
그래프
그래프 구조 그래프란? 그래프는 정점(vertex)과 간선(edge)으로 구성된 자료구조를 의미한다. vertex는 정점, edge는 정점과 정점을 연결하는 간선이다. 그래프는 네트워크 모델 즉, 객체와 이에 대한 관계를 나타내는 유연한 방식으로 이해할 수 있다. 특징 • 순환 혹은 비순환 구조를 가진다. • 루트-노드 개...
트리의 부모 찾기
문제 파악 문제 🔖 백준(실버2) - 트리의 부모 찾기 주요 조건 • 각 노드의 부모노드를 구해야 한다. • 메모리 관리를 위해 인접리스트를 사용해야 한다. 문제 해결 과정 핵심 로직 • 방문한 노드의 부모 노드를 리스트에 추가해준다. 해결 순서 ⒈ 인접 리스트를 생성해준다. ⒉ 부모 노드를 저장할 배열을 생성해준...
효율적인 해킹
문제 파악 문제 🔖 백준(실버1) - 효율적인 해킹 주요 조건 • A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다. 추가 학습 이번 문제는 시간초과 와 메모리초과 를 모두 경험할 수 있었던 문제이다. 우선 메모리초과 가 났던 이유는 인접행렬을 사용했기 때문이다. 메모리 측면에서 보자면 인접행렬은 노드의 모든 ...
안전 영역
문제 파악 문제 🔖 백준(실버1) - 안전 영역 주요 조건 • 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수 • 아무 지역도 물에 잠기지 않을 수도 있다. TEST CASE Test Case 5 6 8 2 6 2 ...
연결 요소의 개수
문제 파악 문제 🔖 백준(실버2) - 연결 요소의 개수 주요 조건 • 서로 연결된 노드가 없다는 것을 파악하기 TEST CASE Test Case 6 5 1 2 2 5 5 1 ...
유기농 배추
문제 파악 문제 🔖 백준 - 유기농 배추 🔖 유사문제 주요 조건 • 인접해 있는 노드들의 무리수를 구해야한다. TEST CASE Test Case 1 5 3 6 0 2 1 2...
데코레이터 패턴
데코레이터 패턴 데코레이터 패턴이란? OCP를 만족하는 디자인 패턴 데코레이터 패턴으로 객체에 추가 요소를 동적으로 더할 수 있다. 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다. 데코레이터 패턴의 특징 • 데코레이터의 슈퍼클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같다. • 한 ...
바이러스
문제 파악 문제 🔖 프로그래머스 - 바이러스 주요 조건 • 1번 컴퓨터에 연결된 컴퓨터들만 바이러스가 걸린다. TEST CASE Test Case 7 6 1 2 2 3 ...
옵져버 패턴
옵저버 패턴 옵저버 패턴이란? 옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 옵져버 패턴은 여러 가지 방법으로 정의할 수 있지만, 보통은 주제 인터페이스와 옵저버 인터페이스가 들어있는 클래스 디자인으로 구현하다. ...
게임 맵 최단거리
문제 파악 문제 🔖 프로그래머스 - 게임 맵 최단거리 미로탐색 과 비슷한 유형의 문제이다. 주요 조건 • 상대 진영에 도착하기 위해서 지나야하는 칸의 최소 갯수 • 상대 진영 주위에 벽이 있다면 상대 팀 진영에 도달할 수 없다. 이때는 -1을 반환한다. 문제 해결 과정 핵심 로직 • BFS를 구현한 최단거리 구하기 • ...
미로탐색
문제 파악 문제 🔖 백준 - 미로탐색 주요 조건 • (1,1)에서 (N,M)으로 이동할 때 지나야 하는 최소 칸 수 • 최소 칸 수 = 최단거리 이기 때문에 BFS알고리즘을 떠올려야 한다. 입출력 예시 결과 15 문제 해결 과정 핵심 로...
조합
조합 들어가기 앞서… 앞선 문제에서 순열을 사용한 문제를 풀어보았다. 순열이란 서로 다른 n개의 값 중에서 r개의 숫자를 순서를 부여해 뽑는 경우를 말한다. 순서를 고려하기 때문에 1,2,3, 1,3,2를 다른 것으로 취급한다는 이야기이다. 순열이 나오면 항상 따라다니는 녀석이 있다. 그 녀석은 바로 조합!!! 오늘은 조합이 뭔지, 그...
전략패턴
전략 패턴(Strategy pattern) 전략 패턴이란? 전략패턴은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다. 전략패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다. Duck Class 전략패턴을 사용하여 아래의 예제들을 풀어보기로 했다. Duck 클래스는 아래와...
디자인패턴 소개
디자인 패턴 디자인패턴이란? 라이브러리나 프레임워크가 도와주지 못하는 부분을 도와주는 것. 디자인 패턴은 개발자 사이에서 서로 모두 이해할 수 있는 용어를 제공한다. 일단 용어를 이해하고 나면 다른 개발자와 더 쉽게 대화할 수 있고, 패턴을 아직 잘 모르는 사람들에게는 패턴을 배우고 싶은 생각이 들도록 자극을 줄 수 있다. 또한 자...
소수찾기
문제 파악 문제 🔖 프로그래머스 - 소수찾기 🔖 참고 블로그 주요 조건 • 11과 011은 같은 숫자로 취급한다. • 012은 숫자 0, 1, 3이 흩어저 있다는 의미 입출력 예시 numbers return “17” 3 ...
다리를 지나는 트럭
문제 파악 문제 🔖 프로그래머스 - 다리를 지나는 트럭 주요 조건 • 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는가? • 다리에 완전히 오르지 않은 트럭의 무게는 무시한다. 입출력 예시 bridege_length weight truck_weights return ...
주식가격
문제 파악 문제 🔖 프로그래머스 - 주식가격 주요 조건 • 가격이 떨어지지 않은 기간이 몇 초인지 반환. • (주의) 1초뒤에 가격이 떨어진다 == 1초간 가격이 떨어지지 않았다. 입출력 예시 prices return 1, 2, 3, 2, 3 ...
기능개발
문제 파악 문제 🔖 프로그래머스 - 기능개발 주요 조건 • 뒤에 있는 기능이 먼저 개발되더라도 앞에 있는 기능이 개발중이라면 배포되지 않는다. • 앞에 있는 기능이 배포가 되면 같이 그때 같이 배포된다. 입출력 예시 progresses speeds return ...
CentOS7에 Spring Boot 배포 환경 셋팅하기
JDK 설치하기 ✔︎ 만약 자동으로 설치된 java가 있을 경우에는 삭제를 해주고 다시 다운 받으면 된다. yum remove -y [자바 버전] ✔︎ yum 최신버전 유지 yum update ✔︎ 현재 centos에 설치 가능한 jdk 번전확인. yum list java*jdk-devel ✔︎ 필요한 버전의 JDK 설...
메모리 구조
메모리의 구조 프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드되어야 한다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. 따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다. 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다. 영역 ...
Oracle 문법 정리
날짜, 시간 관련 함수 TRUNC(값,옵션) 오라클의 기본적인 함수로 주로 소수점 절사나 날짜의 시간을 없앨때 사용 SELECT CURRENT_DATE ,TRUNC(CURRENT_DATE, 'DD') /* 시간 절사 */ ,TRUNC(CURRENT_DATE, 'HH24') /* 분,초 절사 */ ,...
하노이 탑 이동 순서
문제 풀이 🔖 문제 하노이 탑 이해하기 📚 공식 설명 블로그 하노이 탑 알고리즘은 기둥1에 있는 N개의 원반을 기둥2를 이용해서 기둥3으로 옮기는 알고리즘이다. 이 알고리즘의 메너니즘은 아래와 같이 동작한다. Step 1 기둥1에서 N-1개의 원반을 기둥3을 이용하여 기둥2로 옮긴다. Step 2 기둥1에서 1...
Redirect
Redirect GET 요청시 URL에 쿼리스트링을 남기지 마시오. 오늘 프로젝트 진행 도중 위와 같은 요구사항이 있었다. 그런데 GET 요청을 했을 때는 URL뒤에 쿼리스트링이 꼭 붙는데 어떻게 제거할 수 있을까? 이에 대한 해답은 바로 RedirectAttributes 인터페이스에 정의되어 있는 addFlashAtrributes...
타겟 넘버
문제 풀이 🔖 문제 public class quiz43165 { static int[] numbers = {4, 1, 2, 1}; static int target = 4; static int answer = 0; public static void main(String[] args) { dfs(0, ...
프록시 서버
프록시와 프록시 서버 프록시란? 프록시는 사전적으로 ‘대신’, ‘대리’를 뜻한다. 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 말한다. 프록시 서버란? 프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 서버와 클라이언트 ...
로드 밸런싱
트래픽 트래픽이란? 트래픽이란 서버와 스위치 등 네트워크 장치에서 일정 시간 내에 흐르는 데이터의 양을 말한다. 웹 사이트에 트래픽이 많다는 것은 사용자 접속이 많아서 전송하는 데이터의 양이 많다는 것을 뜻한다. 트래픽이 너무 많으면 서버에 과부하가 걸려서 기능에 문제가 생길수 있다. 교통이나 운수 분야에서 사용하는 교통량(Traff...
빈 자동 등록
빈 등록 빈 등록 방법 빈 등록은 빈 메타정보를 작성해서 컨테이너에게 건네주면 된다. 가장 직접적이고 원시적인 방법은 BeaaDefinition 구현 오브젝트를 직접 생성하는 것이다. 그러나 이 방법은 무리가 있기 때문에 보통 XML문서, 프로퍼티 파일, 소스코드 애노테이션과 같은 외부 리소스로 빈 메타정보를 작성하고 이를 적절한 리더나 ...
내장 톰캣
WHY? Web Server는 정적인 파일을 서빙하고, WAS(Web Application Server)는 WS의 역할과 동적이 부분도 서빙해주는 역할을 한다. 그런데 오늘 프로젝트에서 파일 업로드를 구현하던 와중에 저장할 경로를 설정해주는 부분에서 애를 먹었다. 맨 처음에 경로를 WAS 서버 내부로 지정하려고 했지만 실패했을 뿐더러 WAS...
JPQL 중급문법 - 경로 표현식
경로 표현식 경로식 표현이란? • .(점)을 찍어 객체 그래프를 탐색하는 것 ▷ 상태 필드(stateField) • 단순히 값을 저장하기 위한 필드 (ex. m.username) • 경로 탐색의 끝, 더 이상 탐색을 할 수 없다. ▷ 단일 값 연관 필드 • @ManyToOne, @OneToOne (대상이 엔티티) • 묵시적 내...
스프링 컨테이너와 스프링 빈
스프링 컨테이너 스프링 컨테이너란? ApplicationContext를 스프링 컨테이너라 한다. (인터페이스이다.) 기존에는 개발자가 별도의 AppConfig 사요해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 이 작업을 수행한다. 스프링 컨테이너는 @Configuration 어노테이션이 붙은 별도의 Ap...
관심사의 분리(OCP, DIP 위배 해결)
이전 장에서… 이전 장에서 순수한 자바 코드로 스프링을 구현하면서 아래와 같은 문제에 마주쳤다. 문제 : 할인 정책을 바꾸려면 클라이언트 코드를 수정해야한다…! 위 문제는 OOP설계 원칙 중 OCP를 위배한다. 참고로 OCP원칙은 개방-패쇄 원칙으로 확장에는 열려있어야 하나, 변경에는 닫혀 있어야 한다. 즉, 기능을 변경하거나 확장...
생성자 주입을 써라
생성자 주입을 선택해라! 왜 생성자 주입을 써야할까? 과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 뭘까? 이유 1. 불변 대부분의 의존관계 주입은 한 번 일어나면 애플리케이션 종료 시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존...
롬복과 최신 트랜드
@RequiredArgsConstructor @RequiredArgsConstructor 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 어노테이션을 사용하면 final이 붙은 필드를 못아서 생서자를 자동으로 만들어준다. 기존 코드 @RestController @RequestMapping("/admin") publ...
JPQL 초급문법
Java Persistence Query Language JPQL 소개 • JPQL은 객체지향 쿼리 언어이다. • 엔티티 객체를 대상으로 쿼리한다. • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다. • JPQL은 결국 SQL로 변한다. JPQL 문법 • 엔티티와 속성은 대소문자 구분 ⭕️ • JPQL 키워드는 대...
객체지향 쿼리 언어 - 기본문법
JPA의 다양한 쿼리 방법 실무에서는 대부분 JPQL로 해결이 된다. • JPQL • JPA Criteria • QueryDSL • 네이티브 SQL • JDBC API 직접 적용, MyBatis, SpringJdbcTemplate 사용 JPQL JPQL이란? JPA를 사용하면 엔티티 객체를 중심으로 개발을 진행한다. ...
위장
문제 풀이 🔖 소스 코드 🔖 문제 이번 문제는 getOrDefault() 메서드를 사용할거 같은 느낌은 들었는데 경우의 수를 구하는 방법을 몰라서 풀지 못했다. 추가적으로 유튜브 풀이강좌를 보는 도중에 자바 iterator 인터페이스를 활용해서 문제를 푼 코드를 보고 iterator를 추가로 공부하는 계기가 되는 문제였다.
Iterator, ListIterator, Enumeration
🔎 Iterator, ListIterator, Enumeration 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스 • Enumeration은 Iterator의 구버전이다. • ListIterator는 Iterator의 접근성을 향상시킨 것(양방향) Iterator 메서드 설명 ...
쿠키와 세션
🔎 쿠키와 세션을 왜 사용할까? Http 프로토콜의 특징이자 약점을 보완하기 위해서 사용된다. ⒈ Connectionless 프로토콜 (비연결 지향성) 클라이언트가 서버에 요청을 보냈을 때, 그 요청에 맞는 응답을 보낸 후 연결을 끊는 처리 방식이다. ⒉ Stateless 프로토콜 (상태정보 유지 안함) 클라이언트의 상태 정보...
Spring boot와 Oracle 연동
Dependency 설정 Oracle 관련 dependency <!-- 오라클 JDBC라이브러리 관리 사이트 --> <repositories> <repository> <id>oracle</id> <name>Oracle JDBC Reposito...
JPA의 데이터 타입 분류
엔티티 타입 • @Entity로 정의하는 객체 • 데이터가 변해도 식별자가 있어서 지속해서 추적 가능 • 공유 가능하다. 예를 들면 회원 엔티티의 키나 나이가 값을 변경해도 식별자(ID값)로 인식 가능. 값 타입 • int, integer, string 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 • 식별자가 없고 ...
프록시와 연관관계
들어가기 앞서… Member의 정보만 필요한 상황인데, Member를 조회할 때 Team도 꼭 같이 조회해야 할까? 회원 정보만 필요한 경우에 팀에 대한 정보까지 함께 조회하게 되면 불필요한 데이터를 조회하는 것이기 때문에 최적화가 잘 된 것은 아니다. 그렇다면 경우에 따라 Member만 혹은 Member와 Team을 한 번에 조회해서 가져...
H-Index
문제 풀이 🔖 소스 코드 🔖 문제 저번에 공부한 Comparator를 활용해서 내림차순 정렬을 해보았다. 다른 사람들이 작성한 코드에 비해 시간 복잡도가 매우 높았다. 다른 사람들의 코드를 보고 필요한 부분을 취해야겠다.
고급 매핑
상속관계 매핑 • 객체의 상속구조 와 DB의 슈퍼타입-서브타입 관계 를 매핑 • 관계형 데이터베이스는 상속 관계가 없다. • 슈퍼타입-서브타입 관계라는 논리 모델링 기법이 객체 상속과 유사하다. 슈퍼타입-서브타입 논리모델을 실제 물리 모델로 구현하는 방법은 아래와 같다. 방법 전략 주요 ...
MappedSuperclass
@MappedSuperclass 속성을 전체적으로 공통으로 사용할 때 사용하자. 특징 • 공통 매핑 정보가 필요할 때 사용한다. • 상속 관계 매핑 X • 엔티티X, 테이블과 매핑X • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공 • 조회, 검색 불가(em.find(BaseEntity) 불가) • 직접 생성해서 사용할 일...
객체 정렬
객체 정렬의 필요성 단쑨한 숫자나 문자와 같은 기본형(primitive) 데이터는 사람들이 일반적으로 하는 대소 비교라는 개념이 있다. 따라서 우리는 1보다는 2가 크다는 것을 알기 때문에 자바는 이런 통념에 따라 정렬을 해준다. 예를 들어, 게이머들의 점수만으로 별도의 배열을 만들면 다음과 같이 정렬할 수 있다. int[] scores ...
다양한 연관관계 매핑
연관관계 매핑시 고려사항 3가지 ⒈ 다중성 • 다대일 : @ManyToOne • 일대다 : @OneToMany • 일대일 : @OneToOne • 다대다 : @ManyToMany ⒉ 단방향, 양방향 ▷ 테이블 • 외래 키 하나로 양쪽 조인 가능 • 사실 방향이라는 개념이 없음 ▷ 객체 • 참조용 필드가 있는 쪽으로만 참조...
정렬 알고리즘 직접 구현
정렬 알고리즘 정렬(Sorting)이란 데이터를 특정한 기준에 따라서 순서대로 나열하는 것을 말한다. 정렬 알고리즘은 이진 탐색의 전처리 과정이기도 하기 때문에 확실히 알아둬야 한다. 정렬 알고리즘은 굉장히 다양한데 이 중에서 많이 사용하는 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬을 공부해보려고 한다. 오늘 프로그래머스의 K번째 수 ...
k번째 수
문제 풀이 🔖 소스 코드 🔖 문제 🔖 정렬 알고리즘 정리 링크 Collections에서 제공되는 sort() 메서드를 사용한 방법과 직접 정렬을 구현한 후 채점을 해보니 대략 10배의 시간이 차이가 났다. 이 문제를 통해서 직접 정렬을 구현하는 연습을 해보기로 했다.
같은 숫자는 싫어
문제 풀이 🔖 소스 코드 🔖 문제 사용된 자료구조 Stack Stack 자료구조를 사용해서 푸는 간단한 문제였다. 마지막으로 들어간 값과, 넣을 값을 비교했을 때, 그 값이 같다면 아무런 동작을 하지 않고 다르다면 마지막으로 들어간 값을 pop()하고 새로...
최소직사각형
문제 풀이 🔖 소스 코드 🔖 문제 사용된 알고리즘 완전탐색 나는 Collections에서 제공해주는 max함수를 사요했는데, java.lang.Math에서 제공해주는 max로 풀이를 하는 방법도 있었다.
연관관계 매핑
연관관계 매핑이 없다면? 객체와 테이블 연관관계의 차이 객체를 테이블에 맞추어 모델링을 하면 아래와 같이 작성해야 한다. ▷ Member 엔티티 @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; ...
완주하지 못한 선수
문제 풀이 🔖 소스 코드 🔖 문제 사용된 자료구조 주요 메서드 HashMap getOrDefault getOrDefault 메서드를 활용해서 풀면 간다하게 해결할 수 있던 문제였다. 하지만 나는 User라는 클래스를 생성해서 문제를 해결...
소수 만들기
문제 풀이 🔖 소스 코드 🔖 문제 사용된 알고리즘 에라토스테네스의 체 에라토스테네스의 체 에라토스테네스의 체는 소수를 찾는 방법이다. 소수 : 자기 자신과 1만을 약수로 가지는 수 메커니즘은 아래와 같다. 순서 ...
영속성 관리 - 내부 동작 방식
영속성 컨텍스트 영속성 컨텍스트 JPA에서 가장 중요한 2가지는 아래와 같다. • 객체와 관계형 데이터베이스 매핑하기 • 영속성 컨텍스트 영속성 컨텍스트는 JPA를 이해하는데 가장 중요한 용어이다. 쉽게 말하면 Entity를 영구 저장하는 환경 이라는 뜻이다. EntityManager.persist(entity); 중요!!...
엔티티 매핑
엔티티 매핑 엔티티 매핑 소개 설명 어노테이션 객체와 테이블 매핑 @Entity, @Table 필드와 컬럼 매핑 @Column 기본 키 매핑 @Id 연...
모의고사
문제 풀이 🔖 소스 코드 🔖 문제 이번 문제는 완전탐색을 활용해서 푸는 문제였다. 문제 풀이의 핵심은 반복문을 사용해서 수포자의 정답지?를 채우는 것이였다. 동등연산자 Integer a = 128; Integer b = 128; Integer c = 100; Integer d = 100; boolean test = a == b; b...
JPA란?
왜 JPA인가? 이런 경우를 생각해보자. 기존에는 아래와 같이 Vo설계를 했을 것이다. public class Member { private String name; private String birth; } INSERT INTO MEMBER (NAME, BIRTH) VALUES (:name, :birth) 그러나 기획이 바뀌게 ...
포캣몬
문제 풀이 🔖 소스 코드 🔖 문제 사용된 자료구조 Set(HashSet) Set 중복을 허용하지 않는 자료구조. 정리된 블로그
단지번호 붙이기
문제 풀이 🔖 소스 코드 🔖 문제 사용된 알고리즘 깊이 우선 탐색 이번 문제는 난이도가 있었다. 우선 DFS 알고리즘을 활용해 푸는 방법은 맞았다. 하지만 상하좌우를 이동하면서 탐색을 해야하는 조건이 추가되었다… 상하좌우 이동 우선 상하좌우 이동을 하...
음양더하기
문제 풀이 🔖 소스 코드 🔖 문제 사용된 메서드 Arrays.stream().sum()
Cors 정책
Cors 관련 블로그 출처(Origin)란? 서버의 위치를 의미하는 https://naver.com 과 같은 URL은 하나의 문자열 같지만, 아래와 같이 구성되어 있다. 이 때 출처는 Protocol, Host, Port를 모두 합친 것을 의미한다. 출처(Origin)란?
DFS와 BFS
문제 풀이 🔖 소스 코드 🔖 문제 사용된 알고리즘 깊이 우선 탐색 넓이 우선 탐색 들어가기 앞서… 탐색은 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 의미한다. 대표적인 탐색 알고리즘으로 DFS와 BFS를 꼽을 ...
크레인 인형 뽑기
문제 풀이 🔖 소스 코드 🔖 문제 사용된 자료구조 부가 설명 Stack 후입선출 알고리즘을 사용하는 자료구조 pop() Java에서 제공해주는 Stack클래스는 List 인터페이스를 구현한 구체클래스이다. Stack클래스가 제공...
2020 카카오 인턴십 - 키패드 누르기
문제 풀이 🔖 소스 코드 규칙을 찾아 나머지, 몫을 활용해서 푸는 구현 문제였다. 목 & 나머지 int quotient = 5 / 3; // 1 int remainder = 5 % 3; // 2 Math.abs() 절대 값을 갖기 위해서 사용한 메서드. int num = Math.abs(-1); // 1 ...
싱글톤 컨테이너
싱글톤 전의 문제점 스프링 없는 순수한 DI 컨테이너는 클라이언트의 요청이 올 때마다 새로운 객체를 생성했다. 그런데 만약 우리 서비스 사용자가 많아서 초당 10000개의 요청이 온다고 하면 순수한DI 컨테이너는 굉장히 많은 메모리를 낭비하게 된다. 이 문제에 대한 해결방안은 객체를 딱 1개만 생성하고, 공유하도록 설계하면 된다. 이것을 가능...
백준 1920번(수 찾기)
문제 풀이 🔖 소스 코드 이번 문제는 이분탐색 알고리즘을 사용해서 푸는 간단한 문제였다. 이분탐색(Binary Search) 정렬되어 있는 배열에서 데이터를 찾으려 시도할 때, 순차탐색처럼 처음부터 끝까지 하나씩 모든 데이터를 체크하여 값을 찾는 것이 아니라, 탐색 범위를 절반씩 줄여가며 찾아가는 방법이다. 시간복잡도 탐색...
2021 KAKAO BLIND RECRUITMENT - 신규 아이디 추가
문제 풀이 🔖 소스 코드 오늘 문제는 정규표현식과 replaceAll(String regex, String replacement) 메서드를 사용하여 해결하는 구현 문제였다. 정규표현식 정규 표현식 설명 ^ 문자열 시작 $...
SpringBatch란?
Spring Batch Batch Processing 은 일괄처리라는 뜻을 가지고 있다. 일괄처리의 의미는 일련의 작업을 정해진 로직으로 수행하는 것이라고 할 수 있다. 이런 일과 처리는 아래와 같은 경우에 필요하다고 한다. ⒈ 대용량 비즈니스 데이터를 복잡한 작업으로 처리해야 하는 경우 ⒉ 특정한 시점에 스켜쥴러를 통해 자동화된 작업이 ...
SpringBatch 구조
Spring Batch 구조 Job Job은 간단히 Step의 컨테이너(묶음?)이다. Job 은 배치 작업이다. 혹은 Flow라고도 부른다. 최소 하나의 Step을 가져야하며, 엄청나게 복잡한 Job이 아닌 이상 2-10개의 Step을 권장한다. 다른 Spring 프로젝트와 마찬가지로 Job은 XML 구성 파일 또는 Java...
제2장 - 의미 있는 이름
의도를 분명히 밝혀라! 변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야한다. ⒈ 변수(혹은 함수나 클래스)의 존재 이유는? ⒉ 수행 기능은? ⒊ 사용 방법은? 따로 주석이 필요하다면 의도를 분명히 드러내지 못했다는 말이다. public List<int[]> getThem() { List<i...
제1장 - 깨끗한 코드
코드란? 코드는 요구 사항을 표현하는 언어다. 시간을 들여 깨끗한 코드를 만드는 노력이 비용을 절감하는 방법일 뿐만 아니라 전문가로서 살아남는 길이다. 새로운 코드를 짜면서 우리는 끊임없이 기존 코드를 읽는다. 깨끗한 코드란? ⒈ 반드시 필요한 내용만 담아야 한다.(하나의 기능만 수행) ⒉ 주의 깊게 작성한 코드다. ⒊ 중복을 피하는...
ThymeLeaf Validation
BindingResult BindingResult 파라미터의 위치는 반드시 @ModelAttribute 뒤에 와야한다. 타임리프는 스프링의 BindingResult를 활용해서 편리하게 검증 오류를 표현하는 기능을 제공한다. 파라미터 넣어야할 값 #fields ...
Swagger 설정
Spring Boot + Swagger(Springdoc) Dependency <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1....
ThymeLeaf 스프링 통합
입력 폼 처리 기능 설명 th:object 커멘드 객체를 지정한다. *{...} 선택 변수 식이라고 한다. th:object에서 선택한 객체에 접근한다. th:field HTML 태그의...
Indexing
들어가기 앞서. 성능 이슈를 만나다. 현재 공기질 프로젝트를 유지보수를 담당하고 있는데, 새로운 이슈가 들어왔다. 실시간 공기질 통계 페이지가 열리는데 굉장히 오래걸리는 이슈였다. 책과 구글링 결과 Indexing이라는 방법을 알게됐다. 이 포스팅에서는 해당 이슈를 어떻게 해결했고, 해결하는 과정에서 알게된 정보를 정리하려고 한다. ...
Promise, async, await, Generator
[ Promise ] const pr = new Promise((resolve, reject) => { setTimeout(() => { resolve('ok') reject(new Error('error')) }, 3000) }); pr.then( function(result) { ...
카카오 로그인
[ 연동 준비 단계 ] 📚 카카오 로그인 공식문서 1. 내 어플리케이션 등록하기 그리고 플랫폼 추가하기를 누르고 추가할 플랫폼의 URL을 입련한다. 연습이라서 http://localhost:8080 으로 입력함. 2. 제품설정 활성화 설정을 해주고, Redirect URL을 입력해준다. Redirect URI로 카카오톡 로그...
테이블 조인 설정 변경으로 쿼리 튜닝
튜닝에 앞서… MySql과 MariaDB에서 두 개 테이블의 데이터를 결합하는 조인 알고리즘은 대부분 중첩 루프 조인으로 풀린다. 물론 성능 최적화를 위해 다른 조인 알고리즘을 제공하기는 하지만, 상당수의 조인 방식은 여전히 중첩루프 조인에 기반을 둔다. 튜닝 전 위 쿼리문에서 보면 서브쿼리 쪽에 많은 join문이 있는걸 알 수...
SQL에서 pivot 테이블 생성하기
CASE를 활용한 pivot 테이블 쿼리 문 select ts.sensorkit_name as sensorkit_name ,max(case when a.sensor_id = 'carbon_dioxide' then a.sensor_data end) as carbon_dioxide ,max(case when a.sensor_id =...
자바스크립트 기본
[ 변수 ] 변수는 문자와 숫자, $와 _만 사용한다. 첫글자는 숫자가 될 수 없다. 예약어는 사용할 수 없다. 가급적 상수는 대문자로~~ 변수명은 읽기 쉽고 이해할 수 있게 선언. [ let & const ] 변하지 않는 값은 const , 변할 수 있는 값은 let 으로 선언한다. [ 형변환 ] 자동형변환은...
PostgreSql 시간 다루기
시간 다루기 꾸준히 추가 /* 현재 시간 */ SELECT current_timestamp ; # 2022-06-15 21:45:29.645 +0900 /* 현재 시간 */ SELECT now() ; # 2022-06-15 21:45:29.645 +0900 /* 현재 날짜(년월일) */ SELECT now()::date ; # 2022-...
Spring Security 3
추가 내용 및 수정 사항 원래 jwt 유효성 검사를 인터셉터에서 진행했었는데, 권한 검사랑 코드가 꼬여서 필터로 재구성하였다. @Slf4j public class JwtAuthorizationFilter extends OncePerRequestFilter { // 제외할 경로 추가. @Override protected bo...
Aspect
[ @Aspect ] 스프링 애플리케이션에 프록시를 적용하려면 포인트컷과 어드바이스로 구성되어 있는 어드바이저(Advisor)를 만들어서 스프링 빈으로 등록하면 된다. 그러면 나머지는 앞서 배운 자동 프록시 생성기가 모두 자동으로 처리해준다. 자동 프록시 생성기는 스프링 빈으로 등록된 어드바이저들을 찾고, 스프링 빈들에 자동으로 프록시를 적용해...
Stack
Stack LIFO (Last In First Out) 마지막에 들어온 데이터가 가정 먼저 나오는 특징을 가지고 있다. 실사용 예시로 컴퓨터를 종료하게 되면 먼저 실행했던 프로세스들이 꺼지고, 마지막에 OS가 꺼진다. 메서드 삽입 (Push) Push는 스택의 구조상 최상 위에 데이터가 저장 된다. 삭제 (Pop) Push...
for each
for each 오늘은 자바에서 for문을 돌지 않고, Mybatis의 for each 를 사용하는, 동적 쿼리를 사용해 보았다. 우선 코드는 n개 이상의 로우값을 업데이트 해줘야하는 경우여서 사용. <update id="updateUseYn" parameterType="FileVo"> <foreach collection=...
빈 후처리기
[ 빈 후처리기 - BeanPostProcessor ] BeanPostProcessor 는 번역하면 빈 후처리기인데, 이름 그대로 빈을 생성한 후에 무언가를 처리하는 용도로 사용한다. 빈 후처리기는 빈을 조작하고 변경할 수 있는 후킹 포인트이다. 이것은 빈 객체를 조작하거나 심지어 다른 객체로 바꾸어 버릴 수 있을 정도로 막강하다. 여기서 조작...
포인트컷, 어드바이스, 어드바이저
[ Pointcut ] 대상 여를 확인하는 필터 역할 어디에 부가 기능을 적용할지, 어디에 부가 기능을 적용하지 않을지 판단하는 필터링 로직이다. 주로 클래스와 메서드 이름으로 필터링을 한다. 이름 그대로 어떤 포인트에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이다. [ Advice ] 부가 기능 로직만 담...
Proxy Factory
[ JDK 동적 프록시 & GCLIB ] JDK 동적 프록시 인터페이스를 구현(implement)해서 프록시 생성 JDK 동적 프록시는 인터페이스를 기반으로 프록시를 동적으로 만들어준다. 따라서 인터페이스가 필수이다. InvocationHandler 인터페이스를 구현해서 작성하면 된다. CGLIB (Code Generate ...
Recursive
[ Recursive ] 오늘은 드라이브 폴더 구조를 가져오는 코드를 작성하는 과정에서 재귀쿼리에 대해서 알게 됐다. 오늘 사용해본 바, 재귀쿼리를 사용할 만한 경우는 3가지로 생각된다. ⒈ 카테고리, 태그 ⒉ 회사 부서 검색 ⒊ 폴더 경로 검색 [ 소스 코드 ] WITH RECURSIVE t3 (DATA_SEQ, PARENTS,...
프록시, 프록시 패턴, 데코레이터 패턴
[ Proxy ] 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라, 어떤 대리자를 통해서 대신 간접적으로 서버에 요청할 수 있다. 그리고 프록시가 중간에서 여러가지 일을 할 수 있다. [ Proxy의 주요기능 ] 접근 제어 → 캐싱 → 권한에 따른 접근 차단(실제 서버에 접근하는 것을 제어) → 지연 로딩 부가 기능...
스프링 AOP 포인트컷
[ 포인트컷 지시자 ] 포인트컷 표현식은 execution 같은 포인트컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다. 지시자 설명 execution 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고,...
스프링 AOP 구현
[ 설정 ] 우선 dependency를 추가해주어야 한다. maven <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.20...
스프링 AOP개념
[ 핵심기능과 부가기능 ] 핵심기능은 해당 객체가 제공하는 고유의 기능이다. 부가기능은 핵심기능을 보조하기 위해 제공되는 기능이다. 그리고 보통은 아래의 그림 처럼 부가기능과 핵심기능이 섞여서 들어간다. 보통 부가 기능은 여러 클래스에 걸쳐서 함께 사용된다. 예를 들어서 모든 애플리케이션 호출을 로깅 해야 하는 요구사항을 생각해보자. ...
Thread 구현
Thread 프로세스란 간단히 말해서 ‘실행 중인 프로그램’이다. 프로그램을 실행하면 OS로 부터 실행에 필요한 자원(메모리)를 할당 받아 프로세스가 된다. 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있으며 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다. Threa...
Exception 처리
Exception 처리하기 개발을 하면서 느낀 점인데 비즈니스 로직을 짜는 것도 중요하지만, 예외처리를 하고 해당 예외에 맞는 메세지를 내려주는 것도 매우 중요하단걸 느꼈다. 예외의 종류 Exception에는 크게 두 가지 종류가 있다. 컴파일 시점에 발생하는 예욀르 Exception이라고 하고, 프로그램 실행시에 발생하는 예외를 Run...
Json에서 null값 처리하기
null값을 어떻게 처리할 수 있을까? 간혹가다 DTO에 값이 매핑되지 않는경우 null값으로 반환이 되어서 내려온다. 뭐 사실있어도 크게 상관은 없지만 깔끔하게? null값을 없애보고 싶었다. @JsonIgnore 해당 어노테이션을 사용하면 Jackson이 해당 프로퍼티를 무시하도록 만든다. 필드 레벨에서 상요한다. import com...
choose, when, otherwise
choose, when, otherwise <if>태그와 같이 조건식이 참일 경우 쿼리문을 실행해주는 역할을 한다. 다른 점은 여러개의 <if>태그를 사용한 경우 조건식이 true를 반환하는 <if>태그는 모두 쿼리문이 실행된다. 하지만 <choose>태그내의 여러개의 <when>태그이 있는 ...
resultMap
resultMap resultMap엘리먼트는 마이바티스에서 가장 중요하고 강력한 엘리먼트다. 사실 join매핑과 같은 복잡한 코드는 굉장히 많은 코드가 필요하다. ResultMap은 가단한 구문에서는 매핑이 필요하지 않고 복잡한 구문에서 관계를 서술하기 위해서 필요하다. MyBatis 공식문서를 읽어봤지만 솔직히 이해가 잘 안됐다. 그래서 일...
Recursive
Recursive 오늘은 폴더 디렉토리 구조를 뽑기 위해 로직을 짜던중 알게된 재귀 쿼리에 대해 알아보았다.
Compress
SpringBoot 파일 압축하기 📚 관련 블로그 정리 예정
LogBack
로그 남기기 오늘은 스프링 부트 서버를 돌릴때 로그를 남기는 방법에 대해서 공부한 뒤 프로젝트에 적용해 봤다. 사실 왜 로그를 쌓아야 하고, 쌓은 로그를 통해 어떤 아웃풋을 얻을 수 있는지 이해가 가지 않았다. 그래서 우선 로그를 기록해야 하는 이유에 대해서 알아봤다. 왜 로그를 기록하고 분석해야 할까? 1) 외부로부터의 침입 감지...
BufferedStream
BufferedStream 버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역 버퍼링 : 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작 앞에서 정리한 포스팅에서는 FileStream을 사용하여 파일의 입출력에 대해서 알아보았다. FileStream의 경우 1 byte 단위로 입...
FileStream
MultipartFile을 사용한 파일 업로드 Multipart는 파일을 서버로 전송할 때 많이 사용한다. @PostMappint("/upload/image") public String uploadProfileImage (@RequestParam(name="file") MultipartFile file) throws IOException { ...
백그라운드에서 스프링부트 서버 돌리기
nohup - No Hang Up 회사에서 프로잭트 개발중에 스프링부트 서버를 배포했다. 처음에는 리눅스에서 서버를 백그라운드로 실행하지 않아서 리눅스 서버와 연결을 끊으면 서버가 내려갔다. 해결방법은 아래와 같았다. nohup ./mvnw spring-boot:run -D"spring-boot.run.profiles"=prod > api....
Collector
collect()와 Collectors ▸ **collect()** 는 Collector를 매개변수로 하는 스트림의 최종연산 ▸ **Collector** 는 collect()에 필요한 메서드를 정의해 높은 인터페이스 ▸ **Collectors** 는 다양한 기능의 컬렉터(Collector를 구현한 클래스)를 제공 List<Strin...
Stream
HttpServletRequest에서 request body 값 추출하기 // HttpServletRequest에서 body가져오기 String requestData = request.getReader().lines().collect(Collectors.joining()); // 가져온 body를 jsonObject로 JSONObject jsonO...
Lock
DB락 - 개념이해 세션A가 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션B에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성(Atomicity)이 깨지는 것이다. 추가적인 문제로는 세션A가 중간에 롤백을 하게 되면 세션B는 잘못된 데이터를 수정하는 문제가 발생한다. 이...
데이터베이스 연결구조와 DB세션
데이터베이스 연결구조 1 사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있다. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 된다. 이때 데이터베이스 서버는 내부에 세션 이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션 을 통해서 ...
Transactional
Transaction 트랜잭션은 이름 그대로 번역하면 거래라는 뜻이다. 쉽게 이야기하면 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 뜻한다. 예를 들면 A의 5000원을 B에게 계좌이체한다고 생각해보자. A의 잔고를 5000원 감소하고, B의 잔고를 5000원 증가해야 한다. 5000원 계좌 이체 ...
JOIN
나만 몰랐던 테이블 3개 이상일 때 JOIN 오늘은 세 개 이상의 테이블을 JOIN해서 데이터 결과 값을 가져오는 쿼리를 작성했다. [ 첫 번째 쿼리문 ] SELECT df.DATA_SEQ, df.DATA_TYPE, df.`DEPTH`, df.PARENTS, df.FOLDER_NAME, df.COLOR, f2.FILE_NAME, f2....
SelectKey
Select Key 프로젝트 진행 중 새롭게 INSERT한 데이터의 시퀀스 값을 가져오고 싶었다. 그러던 와중 MyBatis에서 제공해주는 SelectKey 라는 기능을 할게 됐다. 우선 메인 쿼리를 작성하고, 아래의 코드와 같이 작성해주면 된다. 여기서 order라는 파라미터가 있는데 이것은 해당 SeletcKey를 메인 쿼리보다 먼저 ...
스프링과 파일 업로드.
파일 업로드 소개 일반적으로 사용하는 HTML Form을 통한 파일 업로드를 이해하려면 먼저 폼을 전송하는 다음 두 가지 방식을 이해해야 한다. application/x-www-form-urlencoded HTML 폼 데이터를 서버로 전송하는 가장 기본적인 방버이다. Form태그에 별도의 enctype옵션이 없으면 웹 브라우저는 요청 HT...
multipart/form-data
multipart/form-data 파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야 한다. 문자를 전송하는 방식으로 파일을 전송하기는 어렵다. 이 문제를 해결하기 위해 multipart/form-data 라는 전송방식을 제공한다. 이 방식을 사용하려면 Form 태그에 별도의 enctype="multipart/form-d...
File Upload
File Upload 위 등록 폼에 파일을 등록하고 제출 버튼을 눌렀다. 그림을 보면 두개의 part가 생성됐는데, 하나는 파일을 올릴때 이름, 그리고 나머지 하나는 파일의 바이너리 데이터였다. 그리고 콘솔에 찍은 로그를 확인해 보니 아래와 같았다. request=org.springframework.web.multipart.su...
ControllerAdvice
@ControllerAdvice @ExceptionHandler 를 사용해서 예외를 깔끔하게 처리할 수 있게 되었지만, 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 섞여 있다. 이 둘을 분리하기 위해서는 @ControllerAdvice 와 @RestControllerAdvice 를 사용하면 된다. @ControllerAdvice 와 @Res...
Exception Handler
@ExceptionHandler 스프링은 API 예외 처리 문제를 해결하기 위해서 @ExceptionHandler 라는 애노테이션을 사용하는 매우 편리한 예외 처리 기능을 제공하는데, 이것이 바로 ExceptionHandlerExceptionResolver이다. 스프링은 ExceptionHandlerExceptionResolver를 기본으로 제공...
다양한 의존관계 주입 방법
의존관계 주입 의존관계 자동 주입은 스프링 컨테이너가 관리하는 스프링 Bean이어야 동작한다. 의존관계 주입은 크게 4가지 방법이 있다. ✔︎ 생성자 주입 ✔︎ 수정자 주입(setter 주입) ✔︎ 필드 주입 ✔︎ 일반 메서드 주입 생성자 주입 생성자 주입이란? 생성자 주입이란 이름 그대로 생성자를 통해서 의존관계를 주입 받...
IoC, DI, 컨테이너
IoC (Inversion of Control) IoC란? 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것 일반적인 상황에서는 개발자가 직접 new 키워드를 통해 객체를 생성하고, 객체의 의존성을 맺어주고, 실행했다. 하지만 Spring 에서는 xml파일 또는 어노테이션 방식으로 스프링 컨테이너에 Bean을 등록하기...
좋은 객체지향 설계의 5가지 원칙
[ SOLID ] SRP (단일 책임 원칙) Single Responsebility Priciple ✔︎ 하나의 클래스는 하나의 책임만 가져야한다. ✔︎ 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 SRP를 잘 따른 것 처음에 실습한 예제에서 클라이언트 객체는 직접 구현 객체를 생성하고, 연결하고, 실행하는 다양한...
스프링이란?
스프링 스프링이란? 스프링은 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크다. 애플리케이션 프레임워크는 애플리케이션 개발을 빠르고 효율적으로 할 수 있도록 애플리케이션의 바탕이 되는 틀과 공통 프로그래밍 모델, 기술API 등을 제공한다. [ 애플리케이션 기본 틀 - 스프링 컨테이너] 스프링을 사용하려면 먼저 스...
DAO, DTO, VO
DAO (Data Access Object) ✓ 데이터베이스의 Data에 접근하기 위한 객체 ✓ DB를 사용해 데이터의 CRUD를 담당하는 객체 DAO 패턴은 비즈니스 로직과 DB를 분리하기 위해 사용하는 패턴이다. DAO를 만들어서 DB의 접근을 전담하게 만들고, DB를 사용하는 방법이 변경되더라도 클라이언트 로직이 변경되지 않도록 DB로직...
CSR & SSR
SSR 서버에서 데이터까지 모두 포함하여 페이지를 구성한 후 브라우저에 전달 CSR CSR은 SSR보다 초기 전송되는 페이지의 속도는 빠르지만 서비스에서 필요한 데이터를 클라이언트(브라우저)에서 추가로 요청하여 재구성해야 하기 때문에 전제적인 페이지 완료 시점은 SSR보다 느려진다. 참고 블로그
문자열 - 단어의 개수
단어의 개수(1152) 문자열에 공백이 들어갈 경우 if 문으로 분기를 해주지 않으면 공백임에도 불구하고 1이라는 값을 반환한다. // Solve 1 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner i...
문자열 - 문자열 반복
문자열 반복(2675) import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int T = in.nextInt(); for ...
문자열 - 단어 공부
단어 공부(1157) import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String S = in.next().toLowerCase(Locale.ROO...
Java 컬렉션 프레임워크
Java 컬렉션 프레임워크 컬렉션 프레임워크란? 컬렉션 프레임워크 컬렉션 : 여러 객체(데이터)를 모아 놓은 것을 의미 프레임 워크 : 표준화, 정형화된 체계적인 프로그래밍 방식 ✓ 컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식 ✓ 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공 ✓ java.ut...
Java 배열
Java 배열 배열이란? → 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것. 배열은 각 저장 공간이 연속적이다. 배열의 선언과 생성 → 배열을 다루기 위한 참조변수의 선언 // 타입[] 변수이름; int[] arr; // 배열을 선언 arr = new int[5] // 배열을 생성
Java ArrayList
Java ArrayList ArrayList란? ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일하다. ArrayList와 달리 Vector는 자체적으로 동기화처리가 되어있다. List 인터페이스를 구현하므로, 저장 순서가 유지되고 중복을 허용한다. 데이터의 저장공간으로 배열을 사용한다. (배열기반) ...
문자열 - 알파벳 찾기
알파벳 찾기(10809) import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 모든 요소가 -1 인 길이가 26일 배열 i...
문자열 - 아스키 코드
아스키 코드(11654번) import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int ch = in.next().charAt(0); System.out.print(c...
문자열 - 숫자의 합
숫자의 합(11720) import java.util.Scanner; public class Main { Scanner in = new Scanner(System.in); int N = in.nextInt(); String S = in.next(); s.close(); int sum = 0; for (int i=0; i < ...
Spring Security 3
Spring Secutiry 3 [ AuthenticationEntryPoint ] 인증이 되지 않은 유저가 접근 시 호출된다. 존재하는 경로에 로그인 하지 않고(Header에 JwtToken을 넘기지 않고) 접속할 경우, 호출된다. @Component public class JwtAuthenticationEntryPoint implemen...
Optional
Optional Optional이란?? nul이 올 수 있는 값을 감싸는 Wrapper 클래스 Optional<User> user = userDetailsMapper.findUserByEmail("test@gmail.com"); System.out.println("user = " + user); //user = Optional...
Spring Security 2
Spring Secutiry JwtAuthenticationFilter Class 스프링 시큐리티에 UsernamePasswordAuthenticationFilter가 있음. login 요청해서 username, password를 post로 전송하면 UsernamePasswordAuthenticationFilter가 동작을 함 Use...
Spring Security
Spring Secutiry Spring Security란? Spring 기반의 애플리케이션의 보안(인증, 인가)을 담당하는 스프링 하위 프레임 워크 인증(Authenticate) : 현재 사용자가 누구인지 사용자의 신원을 증명하는 프로세스 인가(Authorize) : 사용자에게 특정 리소스나 기능에 액세스할 수 있는 권한을 부여하는...
Interceptor
🔎 Interceptor 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다. Spring...
ArgumentResolver
🔎 ArgumentResolver 로그인된 사용자를 애노테이션으로 확인하는 방법은 없을까? @Login이라는 argument를 처리해주는 ArgumentResolver를 만들고 이를 활용하면 충분히 가능하다. @Login @Login 애노테이션은 자동으로 세션에 있는 로그인 회원을 찾아주고, 만약 세션에 없다면 null 을 반환하도록 한...
Filter
🔎 Filter, Interceptor 로그인을 하지 않은 사용자가 물건을 주문하는 일은 없어야 한다. 그렇다면 로그인 하지 않은 클라이언트는 다시 로그인 페이지로 이동시키는 등 적절한 조치를 취해주어야한다. 그런데 이런 조치를 모든 요청에 코딩한다면 매우 생산적이지 않다. 이런 문제를 해결하기 위해선 Filter와 Interceptor를 사...
MariaDB 연동
Jwt Token
🔎 JWT Token 공식 문서 잘 정리된 블로그 🔎 동작 원리 클라이언트가 로그인을 하면 서버에서 Jwt Token을 발급해준다. 클라이언트는 발급 받은 Jwt Token을 앞으로 있을 모든 요청에 함께 보낸다. 왜냐면 요청 보내는 클라이언트를 식별해야 하기 때문이다. 🔎 구조 Header + Payload + Signatur...
변수의 초기화
🔎 변수의 초기화 지역변수(lv)는 수동 초기화 해야한다. 멤버변수(iv, cv)는 자동 초기화 된다. class InitTest() { int x; // 인스턴스 변수 int y = x; // 인스턴스 변수 void method1() { int i; // 지역변수 int j = i; // 에러 -> 지역변수를...
다형성(Polymorphism)
🔎 다형성 다형성이란? 여러 가지 형태를 가질 수 있는 능력. 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것. 즉, 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 다형성이다. class Tv { boolean power; int channel; voi...
Getter & Setter
🔎 Getter와 Setter 메소드 Setter 일반적으로 객체지향 프로그래밍에서 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막는다. 그 이유는 외부에서 마음대로 바꿀경우 객체의 무결정성이 깨질수 있기 때문이다. 이러한 문제점을 막기 위해서 객체지향 프로그래밍에서는 필드는 공개하지 않고 메소드를 공개함으로써 필드를 바꾸는 ...
Interface
🔎 인터페이스 인터페이스란? 🔥 추상 메서드의 집합 🔥 구현된 것이 전 없는 설계도. (껍데기-모든 멤버가 public) 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스 객체의 메소드를 호출시킨다. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 ...
Inheritance
🔎 Inheritance(상속) 상속의 장점 ⒈ 중복되는 코드를 줄여준다. ⒉ 효율적이고, 개발시간 단축. ⒊ 유지보수 시간을 최소화 가능. 클래스 상속 extends 뒤에 두 개 이상의 부모클래스는 올 수 없다. 즉, java에서는 단일 상속만 가능하다. 자식클래스 extends 부모클래스 {} 추가적으로 조상(부...
Java 제어자
🔎 접근 제어자 사용하는 이유 외부로 부터 데이터를 보호하기 위해서 사용한다. (캡슐화) 또한 내부적으로 사용되는 부분을 감추기 위해서 접근 제어자를 사용한다. 클래스의 접근 제한 ⒈ pubilc 같은 패키지 뿐만 아니라 다른 패키지에서도 아무런 제한없이 사용할 수 있다. 라이브러리 클래스로 개발할 경우에 사용하면 좋다...
Java 클래스
🔎 클래스 객체란? 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것. → iv(Instance Variable)의 집합 → iv는 인스턴스가 생성될 때 만들어진다. 속성 : 필드 (field) 동작 : 메소드 (method) 클...
혼공자 정리
🔎 기본 타입의 허용 범위 크기 순서 Byte. < short < int < long < float < double 🔎 값 출력 %s : 문자열 %d : 정수 %f : 실수 🔎 조건문 if 절 If (조건문) { 실행문 } else if { 실행문 } else { 실행문 ...
교착 상태
Deadlock [ 교착 상태 ] 자원(Resuorce)와 굉장히 밀접한 관계를 가진다. Blocked/Asleep state 프로세스가 특정 Event를 기다리는 상태 프로세스가 필요한 자원을 기다리는 상태 Deadlock stats 프로세스가 발생 ...
TemplateHTMLRenderer
🔎 TemplateHTMLRenderer DRF docs-topic 오늘은 여태까지 통상적으로 사용했던 JSONRednerer말고 HTMLRenderer를 사용해봤다. TemplateHTMLRenderer 클래스는 딕셔너리 형태로 데이터를 넘겨줘야한다. 보통 context라는 변수를 통해 넘겨주는거 같다. ex. context = {“k...
html,css 기본 정리
🔎 html html공부 링크 form 태그 action : 입력 데이터(form data)가 전송될 URL 지정 method : 입력 데이터(form data) 전달 방식 지정 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g...
Permissions
🔎 object level permissions “객체 수준의 허가(권한)” 는 DRF의 generic view가 get_object() 메소드를 호출할 때 실행된다. “view 수준의 허가(권한)” 과 마찬가지로 해당 객체에 대한 작업을 진행할 수 없을 경우에는 exceptions.PermissionDenied 예외가 발생한다. 만일 내가 ...
전송계층
들어가기 앞서… 왜 필요할까? 네트워크 계층에서 다른 네트워크로 데이터를 전송하는 데에는 라우터가 필요하다. 그리고 라우터의 라우팅 기능을 이용하여 데이터를 전송한다. 그런데 이 라우터에 문제가 생기거나, 패킷이 손상되면 데이터가 수신지에 도착하지 못하게 될 것이다. 이런 문제를 예방하기 위해 전송계층이 존재하는 것이다. 네트워크 접...
물리 계층과 데이터 링크 계층
💡 물리 계층 계층 네트워크 장비 예 주요기능 물리계층(1층) 허브, 라우터 케이블 이더넷 물리적 매체를 통해 비트의 흐름 전송 물리 계층이란? 상위 계층인 데이터 링크 계층에서 형성된 데이...
네트워크 계층
들어가기 앞서… 프로토콜 프로토콜은 네트워크에서 통신하려는 두 시스템 간에 무엇을, 언제, 어떻게 통신할 것인지 미리 정해 놓은 약속이다. 즉, 시스템의 차이로인해 통신이 되지 않는 문제가 발생할 수 있기 때문에 서로 다른 시스템 간의 통신에는 일련의 표준이 필요한데 이러한 규칙이 프로토콜이다. 정리하자면 프로토콜은 네트워크에 연결된 컴퓨...
OSI 참조 모델
💡 OSI 참조 모델 데이터 단위 = PCI + SDU(데이터) 각 계층은 헤더와 데이터 단위로 정의되며, 헤더에는 각 계층의 기능과 정보가 포함된다. 송신 측이 헤더를 생성해서 추가하면 수신 측의 해당 계층이 이 헤더를 사용한다. 데이터 단위는 헤더를 추가한 데이터를 전송하는 기본단위이다. 상위 계층이나 하위 계층 사이에 주고...
네트워크 용어 정리
패킷(packet) 정의 컴퓨터 간에 데이터를 주고받을 때 네트워크를 통해 전송되는 데이터의 전송단위(작은조각). 헤더, 페이로드(payload), 제어 요소 등을 포함하는 데이터 세그먼트. 헤더 : 데이터의 형태, 데이터의 송수신지, 일련번호 등 페이로드 : 실제 전송 데이터를 포함. ...
Docker Compose
💡 docker compose 도커 컨테이너를 실행할 때 필요한 복잡한 명령어를 매번 기억하는건 쉽지않다. 그러나 docker compose를 사용한다면 하나의 파일로 모든걸 해결할 수 있다. 우선 docker command에서는 네트워크를 정의해야 한다. docker network create <만들 네트워크 이름> docker ...
Docker 명령어 ADD, COPY
💡 ADD & COPY 오늘은 Docker 공식문서에서 ADD와 COPY에 대한 내용을 정리했다. 일반적으로 ADD와 COPY는 기능적으로 비슷하다. 하지만 DOCKER는 COPY를 추천한다. 왜냐면 COPY가 보다 투명?하기 때문이다. COPY는 단순하게 로컬에 있는 파일을 복사 붙여넣는 기능이다. ADD의 가장 좋은 용도는 ...
docker with [ Nginx + uWSGI + django ]
💡 project의 dockerfile dockerfile #1 FROM python:3.9.7 #2 ENV PYTHONUNBUFFERED 1 #3 RUN apt-get -y update RUN apt-get -y install vim #4 RUN mkdir /srv/docker-server ADD . /srv/docker-se...
Dango + uWSGI + Nginx
💡 uWSGI Web서버가 받은 호출을 Python 어플리케이션에게 전달하고 응답받기 위한 호출조약(Calling Convention) uWSGI <-> Django uWSGI.ini (설정파일) [uwsgi] # 장고 프로젝트 경로 chdir = /Users/giljun/gilbert/drf_todo # wsgi ...
웹서버
오늘은 내가 여태까지 잘못 알고 있던 개념에 대해서 제대로 알게됐다. 플라스크에서 사용하는 flask run, 그리고 django에서 사용하는 runserver 명령어들이 나는 단순히 내가 만든 프로젝트를 구동해주는 명령어로 알고 있엇다. 하지만, 위 명령어들은 내가 만든 Web Application을 각 프레임워크에서 제공해주는 dev ser...
Django raw SQL queries
💡 django에서 SQL문으로 개발하기 오늘 django document를 읽는데 우연히 발견하게 됐다. Django에는 raw() manager가 있다. 이 메서드를 사용해서 직접 쿼리문을 작성할 수 있다. 직접 실습을 위해서 djagno shell_plus에 진입했다. 쿼리문 내에서 매개변수를 넘겨줄 때는 두 가지 방법이 있다. ...
DRF 로그인(POST) & 회원정보(GET)
💻 로그인 구현 # serializers.py class LoginSerializer(serializers.ModelSerializer): email = serializers.EmailField(max_length=255, min_length=3) password = serializers.CharField(max_length=68, m...
Redis
💡 Redis 💻 Redis 관련 정리된 블로그 Redis는 Remote Dictionary Server의 약자로서, “키-값” 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템 오늘은 DB 접근을 최대한 줄여서 성능을 높여보는걸 연습해보고 싶어서 Redis를 사용했다. 우선 redi...
DRF에서 ModelSerializer란?
DRF ModelSerializer documentation 정리 💡 ModelSerializer 종종 Django 모델 정의에 밀접하게 매핑되는 serializer 클래스가 필요하다. ModelSerializer 클래스는 모델 필드에 해당하는 필드가 있는 Serializer 클래스를 자동으로 만들 수 있는 shortcut을 제공한다. ...
DRF에서 serializer란?
DRF serializers documentation 내용 정리 💡 Serializers Serializers를 사용하면 ‘queryset’ 및 ‘모델 instance’와 같은 복잡한 데이터를 JSON, XML 또는 기타 콘텐츠 유형으로 쉽게 렌더링할 수 있는 기본 Python 데이터 유형으로 변환할 수 있다. DRF의 Serializer ...
비밀번호 변경(PATCH요청)
PATCH요청을 통한 비밀번호 변경을 구현해봤다. # serializer.py from rest_framework import serializers from .models import User class ChangePasswordSerializer(serializers.Serializer): password = serializers.Char...
Yet another Swagger generator
💡 drf_yasg 파라미터가 필요한 GET요청을 할 때는 스키마를 작성해주어야 한다고 한다. 만약, 파마리터가 따로 없다면, class 와 def 사이에 있는 코드는 작성하지 않아도 된다. 상속받는 클래스는 APIView이어야 한다. (APIView를 상속받는 클래스도 가능) class VerifyEmail(views.APIView):...
DRF 회원가입 구현
오늘 공부한 “DRF로 회원가입 구현하기”에서 배운 부분과, 오류 해결 및 해결 방법을 정리했다. 💻 ** 마주친 오류 & 해결방법 ** 📝 코드 ❌ 회원가입시 생긴 오류. 에러메세지 : create_user() got an unexpected keyword argument ‘phone’ 오류 원인 : usermanager...
21.12.27 SQL 공부
오늘은 MySQL에서 사용되는 KEY의 종류에 대해서 알아보았다. 📌 Primary Key 📌 Unique Key 📌 Multiple Occurences Key MySQL이 내부적으로 저장되는 값의 상태에 따라 인덱스를 할당하여 검색속도를 빠르게 처리하기 위한 키라고 한다. 인덱스는 테이블 상에서 MUL 로 표시가 된다. ⒈ 두 개...
Index
💡 Database에서 Index란? 인덱스란 “추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조”이다. 이러한 인덱스는 자주 사용되는 값으로 만들어진 원본 테이블의 사본이라고 생각할 수 있다. 만약 인덱스를 사용하지 않은 컬럼을 조회해야 하는 상황이라면 전체를 탐색하는 Full Scan을 ...
HTTP 구성(요청/응답)
💡 HTTPIE brew install httpie iterms에서 요청과 응답을 눈으로 확인해보고 싶어서 사용한 모듈. curl 보다 사용하기 쉽다는 특징이 있다고 한다. 💡 HTTP Request(요청) 이번에 flask_restx로 만든 로그인 기능으로 요청과 응답을 제대로 정리해봤다. HTTP Request 메세지는 3가...
Jason Web Token
💡 JWT 📚 References JWT란? JWT란? JWT유효시간 설정 Simple JWT
Flask-bcrypyt
💡 비밀번호 안전하게 저장하기 암호를 있는 그대로 DB에 저장하면 보안상 문제가 생긴다. 그래서 오늘은 Flask-bcrpyt를 사용해봤다. # __init__.py from flask_bcrypt import Bcrypt bcrypt = Bcrypt() def create_app(): app = Flask(__name__) #...
21.12.14 SQL 공부
💡 NULL 처리하기 ∙ IFNULL 해당 필드의 값이 NULL을 반환할 때, 다른 값으로 출력할 수 있도록 해주는 함수. SELECT IFNULL(COL1,'바꿀 변수명') AS COL1 FROM TABLE ∙ CASE TRUE/FALSE를 판단하여 조건에 맞게 값을 변환할 때 사용 ex1 SELECT ANIMAL_TYPE...
Nginx
프록시(Proxy) SSL & TSL TCP/IP TCP/IP DNS(Domain Name System) 💡 Nginx
Event Driven Architecture
💡 EDA 참고 블로그 분산 된 시스템 간에 이벤트를 생성, 발행(publishing)하고 발행된 이벤트를 필요로 하는 수신자에게 전송된다. 이벤트를 수신한 수신자가 이벤트를 처리하는 형태의 시스템 아키텍쳐
View Decorator
💡 View Decorator Decorator란 어떤 함수를 감싸는(Wrapping)하는 함수이다. function과 class에만 적용이 가능하다. 다음과 같이 사용할 수 있다. #-- case1 @login_required def test_view1(request): return render(request, 'instagram/tes...
Media 파일 다루기
💡 Media File FileField/ImageField를 통해 저장된 모든 파일 DB필드에는 저장경로를 저장하며, 파일은 파일 스토리지에 저장 실제로 문자열을 저장하는 필드 💡 Media File 처리순서 HttpRequest.FILES를 통해 파일이 전달 뷰 로직이나 폼 로직을 통해, 유효성 검증을 수행한다. ...
Authorization
장고 패키지에 포함된 django.contrib.auth 앱이 바로 인증 기능을 담당한다. 로그인, 로그아웃 관련해서 settings.py 파일에 지정하는 항목은 세 가지이다. ▪ LOGIN_URL ▪ LOGIN_REDIRECT_URL ▪ LOGOUT_REDIRECT_URL 위 세 가지 항목 중 LOGIN_URL은 디폴트 값을 사용하고, LO...
View
💡 Generic View Django는 웹 프로그램 개발 시 공통적으로 사용하는 로직을 미리 개발해놓고 기본 클래스로 제공하고 있는데, 이들을 Generic View라고 한다. from django.views.generic import ~ 클래스형 뷰를 작성하기 위해서는 클래스형 제네릭 뷰를 상속받아서 필요한 속성과 overridin...
Model
💡 Model 🔎 모델 정의 테이블의 컬럼은 모델클래스의 속성으로 정의하고, 테이블에는 메소드가 없지만 모델 클래스에는 메소드를 정의할 수 있다. 이렇게 함으로써 테이블에 관련된 데이터와 행위를 모두 모델클래스 한 곳에 정의할 수 있는 장점이 있다. 🔎 모델 속성 ORM 기법의 특징에 따라 테이블의 컬럼은 모델클래스의 속성으로 정의한...
다양한 CNN 모델
✍🏼 코랩 환경에서 정리.
이미지 증강
💡 Image Augmentation 이미지 보강은 훈련데이터에 없는 이미지를 만들어내서 훈련데이터를 보강하는 기법을 말한다. Tensorflow에는 이미지 보강 작업을 쉽게 해주는 ImageDataGenerator가 있다. ✍🏼 keras-docs import tensorflow as tf from tensorflow.keras.prepro...
keras-함수형 API
💡 함수형 API Sequential 클래스는 층을 차례대로 쌓은 모델을 만든다. 이 클래스는 층을 차례대로 쌓은 모델을 만든다. 그러나 딥러닝에서는 좀 더 복잡한 모델이 많이 있다. 예를 들어 입력이 2개일 수도 있고 출력이 2개일 수도 있다. 이런 경우에 Sequential 클래스를 사용하기 어렵다. 대신 함수형 API를 사용한다. inp...
CNN을 활용한 이미지 분류
💡 CNN 모델링 실습 MNIST 데이터 로드 from tensorflow import keras from sklearn.model_selection import train_test_split (train_input, train_target), (test_input,test_target) = \ keras.datasets.fashion_m...
합성곱 신경망의 구성 요소
💡 합성곱 신경망(Convolution Neural Network, CNN) 1개 이상의 합성곱 층을 쓴 인공 신경망 입력 데이터 전체에 가중치를 적용하는 것이 아니라 일부에 가중치를 곱한다. 합성곱 층의 뉴런에 있는 가중치 개수는 정하기 나름이다. CNN에서는 뉴런을 필터 혹은 커널이라고 부른다. 보통 커널은 입력에 곱하는 가중치이...
인공신경망(ANN)
💡 Perceptron 퍼셉트론(Perceptron)은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 제안한 초기 형태의 인공 신경망으로 다수의 입력으로부터 하나의 결과를 내보내는 알고리즘이다. 💡 입력층, 은닉층, 출력층 1. 입력층 입력층은 데이터셋이 입력되는 층입니다. 입력되는 데이터셋의 특성(Featu...
심층신경망(DNN)
💡 Deep Neural Network 심층 신경망(Deep Neural Network, DNN)은 입력층과 출력층 사이에 여러 개의 은닉층들로 이뤄진 인공신경망(Artificial Neural Network, ANN)이다. 💡 Flatten Layer 패션 MNIST 데이터는 28*28 크기이기 때문에 인공 신경망에 주입하기 위해 넘...
심층신경망(규제 방법)
💡 검증 손실 에포크에 대한 과대적합과 과소적합을 파악하려면 훈련 세트에 대한 점수 뿐만 아니라 검증 세트에 대한 점수도 필요하다. 에포크마다 검증 손실을 계산하기 위해 keras 모델의 fit() 메서드에 검증 데이터를 전달할 수 있다. validation_data 매개변수에 검증에 사용할 입력과 타깃값을 tuple로 만들어 전달한다. ...
Serializer를 통한 유효성 검사 및 저장
💡 생성자 Serialize의 역할은 요청받은 데이터를 직렬화 해주고, form과 유사하게 입력받은 값의 유효성 검증하고, 검증에 통과한 값들을 사전 형태로 가져오고, 가져온 값들을 DB에 저장하는 역할까지 해준다. Serializer는 Djagno Form과 컨셉 및 사용법이 매우 유사하다. 하지만 생성자(__init__)에 차이가 있다. ...
Form & Serializer
💡 Form & Serializer Serializer / ModelSerializer ▪ 데이터 변환 / 직렬화 지원 ▪ Django의 Form/ModelForm과 유사 Serializer는 view 응답을 생성하는 데에 범용적이고 강력한 방법을 제공해준다. ModelSerializer는 Serializer 생성을 위한 Short...
Renderer
💡 Renderer Renderer를 같은 Endpoint에 대해서 동일한 로직으로 데이터를 처리 하고 나서 최종적으로 응답을 줄 때에 어떤 응답 포맷으로 처리할 것인지를 나타낸다. Content-Type, URL의 방법을 통해서 Renderer 지정 가능하다. 💡 기본 지원 되는 Renderer 1. JSONRenderer (defa...
Operating System
운영체제란? 운영체제는 응용 프로그램이나 사용자에게 편리한 인터페이스 환경을 제공하고 그 결과를 돌려준다. 그리고 컴퓨터 시스템의 자원을 효율적으로 관리하는 SW이다. [인터페이스?] - 사용자가 컴퓨터를 사용할수 있게 해주고, 그 결과를 알려주는 것 - 자동차의 계기판 같은 느낌 [특징] 1. 컴퓨터의 성능을 향상할 뿐 아니라 자원을 효율...
OS의 역할
🔖 운영체제의 역할 1. 자원 관리 사용자는 컴퓨터의 다양한 자원(키보드,사운드카드 등)을 사용하는데 이러한 자원을 응용 프로그램에 나누어 주어 사용자가 원할하게 작업할 수 있게 해준다. 2. 자원 보호 사용자 뿐만 아니라 제3의 사람의 접근을 막는다. 3. 하드웨어 인터페이스 제공 운영체제는 하드웨어 인터페이스가 자동으로 설치...
select_related & prefetch_related
💡 select_related & prefetch_related select_related와 prefetch_related는 하나의 QuerySet을 가져올 때, 미리 related_object들 까지 다 불러와주는 함수이다. 비록 query를 복잡하게 만들긴 하지만, 그렇게 불러온 데이터들은 모두 ‘cache’에 남아있게 되므로 DB에...
ORM
💡 ORM(Object-Relational-Mapping)이란? DB와 OOP 간의 호환되지 않는 데이터를 변화하는 프로그래밍 기법 ▪ 데이터베이스와 프로그래밍 언어 사이에 중간다리 역할 ▪ 코딩을 더욱 편리하게 해준다. ▪ ORM은 간단하지만, 마스터하기는 힘들다. ▪ 왜냐면 각 ORM에는 수십개의 팁과 요령이 있기 때문이다. ▪ pyth...
Transaction
💡 Transaction 이란? ▪ DB의상태를 변화시키기 위해서 수행하는 작업의 단위 ▪ 더 이상 쪼갤 수 없는 업무 처리의 최소 단위 ▪ 메모리의 모든 변화를 하나의 작업 단위로 묶는다. 하나라도 실패하면 전체가 실패 ▪ 성공 혹은 실패 두개의 결과만 존재. 예를 들면, A가 B에게 10000원을 이체했다. 하지만 와이파이 연결의 문제...
ViewSet & Router
💡 ViewSet 2개의 URL을 지원한다. 하나의 URL을 list/create를 지원하고, 나머지 하나는 detail/update/partial_update/delete를 지원한다. 위와 같이 2개로 나눌수도 있지만, ViewSet에서는 2개의 URL 구현을 하나의 단일 클래스에서 제공해준다. ViewSet 안 쓸 경우 from res...
Mixins 상속을 통한 APIView
💡 DRF에서 지원하는 Mixins 반복해서 쓰는 로직을 패턴화 시켜둔것. Python의 상속 문법을 활용한 것이다. Mixin이라는 네이밍을 갖고 있는 class는 클래스라기 보단, 반복해서 쓰는 로직을 패턴화 시켜둔 것이라고 이해했다. 그리고 필요하다면 다양한 믹스인을 만들수도 있다. 아래는 기본적인 Mixin들이다. 1. Crea...
APIView
💡 Serializer를 통한 View 처리 Serializer를 통한 View 처리는 Form 처리와 유사한 방식으로 동작한다. class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = '__all__' # view...
JSON 직렬화
💡 Serialization(직렬화) 모든 프로그래밍 언어의 통신에서 데이터는 필히 문자열 또는 바이트로 표현 되어야 한다. 즉, 데이터를 문자열 또는 바이트로 변환해주는 작업을 직렬화라고 한다. 송신자의 경우에는 객체를 문자열로 변환하여, 데이터를 전송하고(직렬화) 수진자의 입장에서는 수신한 문자열을 다시 객체로 변환하여(비직렬화) 데이터를...
JSON 응답
💡 View에서 JSON응답 모든 View는 HttpResponse 타입의 응답을 해야합니다. 일반적으로 아래의 2가지 방법이 있다. 직접 json.dumps를 통해 직렬화된 문자열을 획득하여 HttpResponse를 통해 응답 JsonResponse(HttpResponse를 상속 받은 클래스) 사용 ...
OOP
💡 OOP 객체 지향 프로그래밍(Object Oriented Programming)은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 🔎 OOP의 5가지 원칙 1. Single Responsi...
Staic 파일의 처리
💡 Static File 개발 리소스로서의 정적인 파일을 말한다.(js, css, image. 등) Django는 One project, Multi App 구조를 가진다. 우선 하나의 APP을 위한 static파일은 app_name/static/app_name경로에 둡니다. 그리고 프로젝트 전반적으로 사용되는 static파일은 settings....
Decorator
💡 Decorator Django로 사용 하다가 보면 로그인 구현에서 @login_required와 같이 장식자를 사용하는 경우가 있었다. 오늘은 Decorator(장식자)에 대해서 제대로 알아봐야겠다. 🔎 자세히 알아보기 Decorator란 대상 함수를 Wrapping하고, Wrapping된 함수의 앞 뒤에 추가적으로 꾸며질 구문들을 ...
MVT
💡 MVC 우선 MVT 패턴을 알기전 MVC패턴을 알아보았다. MVC 패턴이란? 디자인 패턴중에 하나로 구성 요소를 Model, View, Controller로 구성하는 패턴 각각의 구성 요소가 다른 요소들에게 영향을 미치지 않아야한다. 1. Model 데이터를 가지고 있으며, 데이터를 처리하는...
Django's Design philosophies
💡 DJANGO 설계 철학 Django docs에 있는 내용을 읽으면서 정리했다. 1. 느슨한 결합 Django의 기본 목표는 ‘느슨한 결합’과 ‘탄탄한 응집’이다. 느슨한 결합은 하나의 콤포넌트의 변경이 다른 콤포넌트들의 변경을 요구하는 위험을 줄이는 것을 목적으로 하는 시스템에서 콤포넌트 간의 내부 의존성을 줄이는 것을 추구하는 디자...
Cloud Server
💡 클라우드란? 클라우드 컴퓨팅이란 인터넷 기반의 컴퓨팅을 말합니다. 인터넷 상의 가상화된 서버에 프로그램을 두고 필요할때마다 컴퓨터나 스마트폰 등에 불러와 사용하는 서비스입니다. 클라우드(Cloud)라는 단어가 말해주듯, 인터넷 통신망 어딘가에서 구름에 싸여 보이지 않는 컴퓨팅 자원(CPU, 메모리, 디스크 등)을 원하는 대로 가져다 쓸 수 ...
프로젝트 정리
G-Store 📃 목차 1. 주제 및 목표 2. 데이터 선정 3. Django로 웹 사이트 개발 CRUD Modeling Docker Azure(PostgreSQL) 4. 프로젝트 회고 발전된 부분 부족한 부분 ...
PostgreSQL
💡 PostgrsSQL PostgreSQL은 객체-관계형 데이터베이스 시스템(ORDBMS)으로, 많은 기능을 제공하는 오픈소스 DBMS다. PostgreSQL은 관계형 DBMS의 기본적인 기능인 트랜잭션과 ACID(Atomicity, Consistency, Isolation, Durability)를 지원한다. 또한 PostgreSQL은 기...
XML vs JSON
💡 JSON JSON은 JavaScript Object Notation의 약자이다. JSON은 사람이 읽을 수 있는 텍스트 기반의 데이터 교환 표준이다. 이러한 JSON은 XML의 대안으로서 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 고안되었다. 또한 JSON은 텍스트 기반이므로 어떠한 프로그래밍 언어에서도 JSON데이터를 읽고 사용할 수...
DRF 구현
💡 Django 기본 구현 vs DRF 구현 오늘은 Django 기본구현과 DRF구현의 차이점에 대해서 공부했다. 처음에 instagram에서 Post모델에 대한 API를 설계할 때 아래와 같이 했었다. 1. 새 포스팅 내용을 받아 등록하고,확인 ⇨ /post/new/ ; POST요청 2. 포스팅 목록 및 검색 응답 ⇨ /post/ ; GET요...
Django REST framework
💡 Django REST framework Django REST framework (DRF)는 Django 안에서 RESTful API서버를 구축할 수 있도록 도와주는 오픈소스 라이브러리다. DRF를 주요기능들. 1. Django의 페러다임 하에 빠르고 관리하기 쉬운 API를 만들수 있다. 2. Serializer/ModelSerializ...
REST 그리고 RESTful API
💡 API(Application Programming Interface)란? API는 흔히 ‘프로그램들이 소통할 수 있는 인터페이스’ 라고 한다. 예를 들면, 클라이언트가 “오늘 날씨 데이터”가 필요하다고 가정해봤다. 그러면 API는 클라이언트의 요청을 받아서 정리한 뒤, ‘날씨 데이터서버’에 “오늘 날씨에 대한 정보를 주세요”라고 요청을 하...
django + docker + Azure(SQL)배포
📌 오늘 배우고 정리한 목차 1. django + docker + Azure(SQL)배포 🔎 도커를 통한 배포 📌 Azure배포를 위한 static파일 설정 1. 메인 프로젝트 파일에 storages.py를 만들어 준다. django-storage[azure] install하기 requirements.txt에 적어주기 ...
프로젝트 중간 회고2
💡 프로젝트 중간 회고2 ◆ 프로젝트명 : G-Store 시작 : 2021.10.12 (화) 제출 : 2021.10.20 (수) 언어 및 프레임워크 : Python / Django 1.주제 → 주류 판매 스토어 2. 주제 선정 이유 → 현재 쓰고 있는 배달 앱에서는 주류 구매 불가 3. G-Store의 목표 → 소비자들이 ...
프로젝트 중간 회고1
💡 프로젝트 중간 회고1 ◆ 프로젝트명 : G-Store 시작 : 2021.10.12 (화) 중간 회고 : 2021.10.14 (목) 작성일 : 2021.10.15 (금) 제출 : 2021.10.22 (금) 언어 및 프레임워크 : Python / Django 1.주제 → 주류 판매 스토어 2. 주제 선정 이유 → 현재 쓰고 ...