tottenham3의 등록된 링크

키자드에 등록된 총 297개의 포스트를 확인하실 수 있습니다.

Naver Blog

Spring Security + JWT

Json Web Token 세션,쿠키와 같이 비연결성 네트워크의 특징을 연결성으로 사용하기 위한 방법. 세션,쿠키는 서버에 부담이 되는 부분이 있다. JWT는 이런 자원 효율의 문제를 해결하기 위한 방법이다. JWT는 토큰 자체에 유저 정보를 담아서 암호화 한다. 암호화된 내용은 디코딩 과정을 통해서 해석한다. JWT 구조 JWT는 헤더(header), 내용(payload), 서명(verify signature)의 세가지 구조를 가지고 있다. Header : 암호화할 방식(alg), 타입(Type) 등을 포함 Payload : 서버에서 보낼 데이터 - 일반적으로 user의 id, 유효기간 포함 Verify Signature : Base64 인코딩한 Hader, Payload, Secret Key를 더한 값. JWT 인증절차 사용자 로그인 .서버에서는 계정 정보를 읽어 사용자를 확인한 후, 사용자의 고유 ID 값을 부여한다. 기타 정보와 함께 Payload에 집어 넣는다 JWT 토큰의

Naver Blog

database 생성 및 user 추가

database 추가 create database jpa_study01; user 추가 create user 'user명'@'%' identified by '비밀번호'; grant all privileges on 데이터베이스명.*TO 'user명'@'%'; flush privileges; user 조회 및 삭제 (root권한으로 들어가야함) use mysql; select user,host from user; //user명과 host 조회 delete from user where user ='user명' database 사용 use jpa_study01;

Naver Blog

엔티티 생명주기

1.비영속 (new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new Member(); member.setId("memberNo"); member.setUername("userName); 2.영속(managed) 영속성 컨텍스트에 관리되는 상태 Member member = new Member(); member.setId("memberNo"); member.setUername("userName); EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //객체를 저장한 상태(영속) em.persist(member); 3.준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 em.detach(member); 4.삭제(removed) 삭제된 상태 em.remove(member); 영속성 컨텍스트의 이점 1차캐시 한번 이상 조회한 내용은 캐시에

Naver Blog

연관관계 매핑 -단방향

회원(MEMBER)과 팀(TEAM). 회원N 팀1 @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; @Column(name="USERNAME") private String useranme; /* 객체지향적이지 않은 매핑 방법 @Column(name="TEAM_ID") private Long teamId;*/ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="TEAM_ID") private Team team; //setter를 아무렇게나 만들면 set을 할 수 있어서 유지보수에 안좋음. } @Entity @Setter @Getter public class Team { @Id @GeneratedValue @Column(name="TEAM_ID") private Long id; private Strin

Naver Blog

다양한 연관관계

단방향, 양방향 1. 참조용 필드가 있는 쪽으로만 참조 가능 2. 한쪽만 참조하면 단방향 3. 양쪽이 서로 참조하면 양방향 4. 객체의 양방향 관계는 A->B , B->A 처럼 참조가 2군데 (외래키를 갖는곳을 지정해야함) 5. 연관관계의 주인: 외래 키를 관리하는 참조 6. 주인의 반대편: 외래키에 영향을 주지 않음, 단순 조회만 가능 다대일 단방향 정리 1.가장 많이 사용하는 연관관계 2.다대일의 반대는 일대다 다대일 양방향 정리 외래 키가 있는 쪽이 연관관계의 주인 양쪽을 서로 참조하도록 개발 다대일은 '다' 쪽에 외래키가 있어야 함. *일대다는 쓰지 말고 일대다 쓸바엔 다대일 양방향 사용. 일대일 관계 주 테이블이나 대상 테이블 중에 외래 키 선택 가능 ( 주 테이블에 외래키 / 대상 테이블에 외래 키) 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가 * 다대일 단방향매핑과 유사 다대일 양방향 매핑처럼 외래키가있는 곳이 연관관계 의 주인 반대편은 mappedBy 적용 단

Naver Blog

상속관계매핑

상속관계매핑 관계형 데이터베이스는 상속 관계X 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 각각 테이블로 변환 -> 조인 전략 통합 테이블로 변환 -> 단일 테이블 전략 서브타입 테이블로 변환 -> 구현 크래스마다 테이블 전략 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED: 조인전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블전략 (사용X) @DiscriminatorColumn(name="DTYPE") @DiscriminatorValue("XXX") 전략 장단점 조인전략 장점) 테이블 정규화 외래 키 참조 무결성 제약조건 활용가능 저장공간 효율화 단점) 조회시 조인을 많이 사용, 성능 저하 조회 쿼리가 복잡함 데이터 저장시 INSERT SQL 2번 호출 단일 테이블 전략 장점) 조인이

Naver Blog

@MappedSuperclass

실무에서는 Controller, Service, Entity 모두 공통으로 잡아놓는 기초 클래스가 있는데. 그걸 매핑해주는 어노테이션 BaseEntity.java @MappedSuperclass @Data public abstract class BaseEntity { private String createBy; private LocalDateTime createDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; } Item.java @Entity @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn public class Item extends BaseEntity{ @Id @GeneratedValue private long Item_id; @Column private String name; @Column private int pr

Naver Blog

JPA 프록시

프록시 em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 특징 실제 클래스를 상속 받아서 만들어짐 실제 클래스와 겉 모양이 같다. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨. 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체는 처음 사용할 때 한 번만 초기화 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아니다.초기화 되면 프록시 객체를 통해서 실제 엔티티에 접근 가능 프록시 객체는 원본 엔티티를 상속 받음, 따라서 타입 체크시 주의해야함. == 대신 instance of 사용 영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getRefernece()를 호출해도 실제 엔티티 반환 영속성 컨텍스트의 도움을 받을 수 없는 준영속 상태 일때,

Naver Blog

즉시로딩과 지연로딩

즉시로딩 즉시로딩을 사용할 경우 JPA구현체는 가능하면 조인을 사용해서 SQL을 한번에 조회 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생. 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다. @ManyToOne, @OneToOne은 기본이 즉시 로딩 이므로 LAZY 지연로디응로 설정해야함 지연로딩 모든 연관관계에 지연로딩을 사용. 실무에서는 즉시로딩 사용X JPQL fetch 조인이나, 엔티티 그래프 기능을 사용.

Naver Blog

영속성 전이 CASCADE

데이터베이스의 CASCADE와 비슷한듯하다. 영속선 전이 CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함꼐 영속 상태로 만들 수 있다. 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장 @OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) 주의할 점. 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음. 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화 하는 편리함을 제공. 종류 ALL : 모두적용 PERSIST: 영속 (Insert) REMOVE: 삭제 MERGE: 병합

Naver Blog

고아객체

고아객체 고아객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제 참조가 제거된 엔티티는 다른곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능 참조하는 곳이 하나일 때 사용 해야한다. 특정 엔티티가 개인 소유할 때 사용 @OneToOne , @OneToMany만 가능. 참고: 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다. CascadeType.REMOVE처럼 작동됨.

Naver Blog

@Embeddedable

임베디드 타입 1.새로운 값 타입을 직접 정의할 수 있음 2. JPA는 임베디드 타입(embedded type)이라 함. 3.주로 기본 값 타입을 모아서 만들기 때문에 복합 값 타입이라고도 함. 4.int,String과 같은 값 타입 5.기본 생성자를 꼭 생성해야함 6. 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음. 7.임베디드 타입의 값이 null이면 매핑한 컬럼 값은 모두 null 장점 1.재사용 2.높은 응집도 3.값 타입만 사용하는 의미있는 메소드 만들 수 있음. 4.임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 에티티에 생명주기를 의존함. @Data @Embeddable public class Address{ private String city; private String street; private String zipcode; public Address(){} public Address(String city, String st

Naver Blog

JPQL 조인 및 서브쿼리

회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인 //JPQL SELECT m,t FROM Member m LEFT JOIN m.team t on t.name ='A' //SQL SELECT m.*,t.* FROM Member m LEFT JOIN Team t ON m.TEAM_ID = t.id and t.name ='A' 연관관계 없는 엔티티 외부 조인 //JPQL SELECT m,t FROM Member m LEFT JOIN Team t on m.username = t.name //SQL SELECT m.*,t.* FROM Member m LEFT JOIN Team t ON m.username=t.name 서브쿼리 //나이가 평균보다 많은 회원 select m from Member m where m.age > (select avg(m2.age) from Member m2) //한 건이라도 주문한 고객 select m from Member m where (select count(

Naver Blog

TEST 코드

package jpa.study_ex01.service; import jpa.study_ex01.domain.Member; import jpa.study_ex01.repository.MemberRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBoot

Naver Blog

Computed 와 methods

Computed 종속 대상의 변경이 일어나기 전까지는 호출되지 않음. - 데이터의 변화 종속값에 의존하며, 반환하는 결과를 캐싱 한다. methods 렌더링이 일어날 때마다 호출 함수를 실행 결론 computed는 선언된 data의 변화가 일어날때 마다 캐싱을 하여 반환값을 내놓는다. methods는 렌더링 될때마다 호출.

Naver Blog

ES6 Object.setPrototypeOf

const healthObj = { showHealth: function() { console.log("오늘 운동시간:" + this.helthTime); }, setHealth: function(newTime){ this.helthTime = newTime } } const previousObj ={ name: "crong", lastTime: "11:20" }; const myHealth = { "name": "honux", "lastTime": "12:30", }; //set prototypeOf Object.setPrototypeOf(myHealth,healthObj); console.log(myHealth);

Naver Blog

ES6 setPrototypeOf

const healthObj = { showHealth: function() { console.log("오늘 운동시간:" + this.helthTime); }, setHealth: function(newTime){ this.helthTime = newTime } }; const healthChildObj = { getAge: function(){ return this.age; } } Object.setPrototypeOf(healthChildObj,healthObj); const childObj = Object.setPrototypeOf({ age: 22 }, healthObj); childObj.setHealth("11:50"); childObj.setHealth(); console.log("childobj is ", childObj);

Naver Blog

ES6 ArrowFunction

setTimeout(function(){ console.log("settimeout"); },1000) setTimeout( ()=>{ console.log("Arrow"); },1000) let newArr = [1,2,3,4,5].map( (v) =>v *2 ); console.log(newArr); const myObj = { runTimeout(){ setTimeout(()=>{ console.log(this === window); this.printData(); },2000); }, printData(){ console.log("hi codesquad"); } } myObj.runTimeout; function sum(value,size={value:1}){ return value*size.value; } console.log(sum(3,{value:3})); //rest parameter function checkNum(...argArray){ console.log(toS

Naver Blog

Flex

<div class=container> <div class="item"> items1 </div> <div class="item"> items2 </div> <div class="item"> items3 </div> </div> 제어 (content를 품고있는 container) display flex-flow - flex-direction - flex-wrap justify-content align-content align-items items제어 (container 속 컨텐츠들) order flex flex-grow - flex-shrink - flex-basis align-self flex-direction 아이템을 세로,가로 축으로 정렬 row : item을 수평축(왼쪽에서 오른쪽으로 표시) column : item을 수직축으로 row-reverse : row의 반대축으로 column-reverse : column을 반대축으로 flex-wrap nowrap - 모든 item을

Naver Blog

@JsonIgnore

양방향이 걸리는 곳은 모두 @JsonIgroe을 걸어줘야한다. 데이터를 주고 받을 때 해당 데이터는 Igroe되어서 응답값에서 보여지지 않는다 순환참조 방지

Naver Blog

Stream

Stream 1.스트림은 ReadOnly 2. 스트림은 Iterator 처럼 1회용. 3.최종연산 전까지 중간연산은 수행되지 않음. 지연된 연산 public static void main(String[] args) { List<Integer> list = Arrays.asList(3,1,4,2,3); List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList()); System.out.println("**"+ sortedList); } public static void main(String[] args) { IntStream intStream = new Random().ints(1,46); intStream.distinct().limit(6).sorted().forEach(i -> System.out.println(i+",")); } public static void main(String[] args) {

Naver Blog

Spring Data JPA 페이징

@Query(value = "select m from Member m",countQuery = "select count(m) from Member m") Page<Member> findByAge(int age, Pageable pageable); //countQuery는 따로 안해도 상관 없긴함. //Slice는 totalCount를 구하지않고 구하려는 갯수에서 +1개를 더 구해서 추가 페이지 여부를 확인함. Slice<Member> findByAge(int age, Pageable pageable); @Test public void paging(){ //given memberRepository.save(new Member("member1",10)); memberRepository.save(new Member("member2",10)); memberRepository.save(new Member("member3",10)); memberRepository.save(new Member(

Naver Blog

Spring Data 벌크성 연산

@Modifying @Query("update Member m set m.age = m.age+1 where m.age >=:age") int bulkAgePlus(@Param("age")int age); @Test public void bulkUpdate(){ memberRepository.save(new Member("member1",10)); memberRepository.save(new Member("member2",20)); memberRepository.save(new Member("member3",30)); memberRepository.save(new Member("member4",40)); memberRepository.save(new Member("member5",50)); memberRepository.save(new Member("member6",60)); int resultCount = memberRepository.bulkAgePlus(20); System.

Naver Blog

EntityGraph 엔티티 그래프

@Test public void findMemberLazy(){ //given Team teamA = new Team("TeamA"); Team teamB = new Team("TeamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1",10,teamA)); memberRepository.save(new Member("member2",10,teamB)); entityManager.flush(); entityManager.clear(); //when // List<Member> all = memberRepository.findMemberFetchJoin(); entity graph 안쓸때 List<Member> all = memberRepository.findAll(); List<Member> all2 = memberRepository.findEntity

Naver Blog

Auditing

@EnableJpaAuditing @SpringBootApplication public class StudyEx01Application { public StudyEx01Application() { /* compiled code */ } public static void main(java.lang.String[] args) { /* compiled code */ } @Bean //추가 public org.springframework.data.domain.AuditorAware<java.lang.String> auditorProvider() { /* compiled code */ } } BaseEntity @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseEntity { @CreatedDate @Column(updatable = false) private LocalDateTim

Naver Blog

Spring Data Paging

@GetMapping("/members") public Page<MemberDto> list(@PageableDefault(size=5, sort = "username") Pageable pageable){ return memberRepository.findAll(pageable).map(MemberDto::new); } 반환타입이 Page이고 매개변수로 Pageable을 받아야한다. @PageableDefault로 페이징 사이즈와 정렬을 정할 수 있다. pageNumber는 0부터 시작하는데 이걸 커스텀 할 수 있다 @GetMapping("/members") public Page<MemberDto> list(@PageableDefault(size=5, sort = "username") Pageable pageable){ PageRequest pageRequest = PageRequest.of(1,10); //페이지번호 0부터 아니라 1부터 시작하게 return memberRepos

Naver Blog

새로운 식별자 구별하기

@Entity @Getter @EntityListeners(AuditingEntityListener.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Item implements Persistable<String> { @Id private String id; public Item(String a) { id=a; } @CreatedDate private LocalDateTime createDate; @Override public boolean isNew() { return createDate==null; } } import jpa.study_ex01.entity.Item; import org.springframework.data.jpa.repository.JpaRepository; public interface ItemRepository extends JpaRepository<Item,String> { } @

Naver Blog

스프링 부트 2.6 이상, Querydsl 5.0 Unable to load class 'com.mysema.codegen.model.Type'

buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'springdata' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' impl

Naver Blog

JUnit5 Annotation

@Test 본 어노테이션을 붙여야 Test메소드로 인식한다. Test메소드로 인식을 시키기 위한 Annotaion @BeforeAll 해당 테스트 클래스를 초기화 할때 딱 한 번 수행되는 메소드 @BeforeEach 테스트 메소드 실행 이전에 수행 @AfterEach 테스트 메소드 실행 이후에 수행 @Disabled 해당 테스트 메소드 무시

Naver Blog

querydsl 기본 문법 1)

기본 반환타입 @Test public void resultFetch(){ //리스트로가져옴 List<Member> list = queryFactory .selectFrom(member) .fetch(); //단건 Member fetchOne = queryFactory .selectFrom(member) .fetchOne(); // limit 1과 똑같음 Member fetchFirst = queryFactory .selectFrom(member) .fetchFirst(); QueryResults<Member> results = queryFactory .selectFrom(member) .fetchResults(); //숫자타입 long total = queryFactory .selectFrom(member) .fetchCount(); } 정렬 @Test public void sort(){ em.persist(new Member(null,100)); em.persist(new Memb

Naver Blog

querydsl 기본문법 2)

집합 @Test //집합 public void aggregation(){ //쿼리 dsl 제공 튜플 List<Tuple> result = queryFactory.select( member.count(), member.age.sum(), member.age.avg(), member.age.max(), member.age.min() ).from(member) .fetch(); for (Tuple tuple : result) { System.out.println("tuple*****"+tuple); } Tuple tuple =result.get(0); assertThat(tuple.get(member.count())).isEqualTo(4); assertThat(tuple.get(member.age.sum())).isEqualTo(100); assertThat(tuple.get(member.age.avg())).isEqualTo(25); assertThat(tuple.get(member.

Naver Blog

querydsl 기본문법 3)

서브쿼리 //서브쿼리 /* * 나이가 가장 많은 회원 조회 * */ @Test public void subQuery(){ //서브쿼리이기 때문에 밖의 QMember와 ALias가 겹치면 안된다. 다르게선언 QMember memberSub = new QMember("memberSub"); List<Member> result = queryFactory .selectFrom(member) .where(member.age.eq( select(memberSub.age.max()) .from(memberSub) )) .fetch(); assertThat(result) .extracting("age") .containsExactly(40); } /* * 나이가 평균 이상인 회원 * */ @Test public void subQueryGoe(){ //서브쿼리이기 때문에 밖의 QMember와 ALias가 겹치면 안된다. 다르게선언 QMember memberSub = new QMember("membe

Naver Blog

JAVA StringBuilder

StringBuilder String 객체의 추가 및 삭제의 경우 메모리의 할당과 해제를 발생시킨다. String 객체의 연산이 많아질수록 가비지컬렉션이 발생한다. String은 변경불가능한 객체이기 때문이고 StringBuilder는 이러한 String객체를 변경 가능하게 해준다. 메소드 .append() - 문자열 추가 .insert(int offset,String str)- offset위치에 str을 추가 .reverse() - 해당 문자를 뒤집니다. good -> doog .substring(int start, int end) - 인덱싱, 파라미터가 하나라면 해당 인덱스부터 끝까지, 두개라면 시작점과 -1 인덱스까지 .deleteCharAt(int index) - 인덱스에 위치한 문자 하나를 삭제 .delete(int start, int end) - start부터 end-1까지의 문자 삭제 .setCharAt(int index, String s) - index 위치의 문자를

Naver Blog

Service app has neither an image nor a build context specified. At least one must be provided.

#docker #dockercompose

Naver Blog

삼각지 몽탄

몽탄 서울특별시 용산구 백범로99길 50 일요일 주말 2시에 웨이팅 걸고 6시30분에 들었갔다. 이게 우대갈비 3인분이다. 우대 1개 다 갈고 2번째꺼 올려놓은 사진 냠냠 고기는 한대에 15점~20점 정도 되려나? 그리고 뼈에 붙어있는거까지 싹 짤라서 볶음밥 먹을때 같이 구워준다 이것이 바로 그사진.. 그리고 볶음밥 먹기전에 삼겹살 먹어봤다 삼겹살2인분 삼겹살 17,000원 이었던듯? 반찬으로 나오는 와사비,소금,청어알?, 동치미 이렇게 냠냠 먹었고 우대갈비 양은 적었지만 굉장히 맛있었다. 삼겹살은 별로였다. 볶음밥도 맛있었고 소주,맥주는 각각 5천원이었던듯

Naver Blog

신대방삼거리 서민준밀밭

서민준밀밭 서울특별시 동작구 상도로12길 7 콩칼국수를 시켰다. 만원이었나? 간은 밍밍하기 때문에 소금을 타고 먹어야한다 국물 고소하고 진한편이다. 김치도 맛있다

Naver Blog

구로디지털단지 구도로통닭

구도로통닭 구로디지털점 서울특별시 구로구 디지털로32나길 35 2층 구도로통닭 \ 양념반 치즈반을 시켰다. 치킨 안에는 찹쌀밥이 들어있었다. 한마리 몽땅 치즈만 시키려다가 양념반 치즈반을 시켰는데 이게 더 나은 선택이었던거 같다. 맛있다. 사이드로 시킨 닭껍질 튀김 이건 kfc에서 파는게 조금 더 나을듯 생맥주.. 전반적으로 치킨은 매우 만족스러웠다. 닭껍질튀김도 맛있는편 근데 생맥이랑 같이먹으니까 배불러서 맥주를 얼마 못마셨다 치킨의 양념은 달라고하면 더 준다. 티오더에 있었다.

Naver Blog

[홍대] 바다회사랑

바다회사랑 서울특별시 마포구 동교로27길 60 방어 중 포장했다. 부위는 골고루 들어있다. 김,밥,백김치 와사비 등등 부속품으로 온다 방어 꽤 먹어봤는데 여기 왜 줄서서 먹는지는 아직 이해 잘 안가지만 포장이라면 괜찮은듯 회가 두툼하니 야무지긴하다

Naver Blog

[장승배기] 마쯔리

마쯔리 서울특별시 동작구 상도로15길 131 상도 휴엔하임 메뉴판~ 명란치즈찌꾸아 튀김~ 명란크림우동~ 여기는 내가 자주가는 단골집인데 상당히 괜찮은곳~ 모든 안주가 다 평타치고 자리도 괜찮다 사장님도 착하시다

Naver Blog

[광화문] 광화문뚝감

광화문뚝감 서울특별시 종로구 새문안로3길 21 주말이라 그런지 30분정도 웨이팅을 했다. 감자탕 소 를 시켰고 거의 5분만에 나왔다. 큰 뼈 6~7개 있었다. 2명이서 소만 먹으면 양이 좀 적은거같다 중 시켜도 괜찮을듯 감자탕 소 28,000원 볶음밥 3천원 맛은 쏘쏘

Naver Blog

[연남동] 저스트텐동

저스트텐동 연남본점 서울특별시 마포구 동교로46길 3 밑반찬으로 나왔던 방울토마토 존맛탱이었다 냉우동~ 이것도 맛있었다 저스트텐동~ 스페셜텐동이라고 부르는게 맞을듯 양도 적당하고 맛있었다.

Naver Blog

[강남] 더블린브루어리

더블린브루어리 강남점 서울특별시 서초구 서초대로78길 26 2층 그냥 지극히 평범했던..

Naver Blog

docker container 백업

백업전상태 저장 docker commit -p [콘테이너id] [명칭] 백업 docker save -o [저장될파일명].tar [이미지명] 복원 docker load [백업한 파일명].tar docker images 확인

Naver Blog

docker container 설정오류로 무한 restart

mysql에서 my.cnf 파일을 수정했다 수정을 하고 도커 컨테이너를 재실행했더니 mysql이 그냥 계속 리스타트 하는거다.; 왜지? 하고 도커 컨테이너 로그를 봤는데 내가 설정한 부분에서 잘못됐었다. my.cnf파일을 수정해야하는데 container가 계속 혼자 껏다켜지니 docker exec -it 컨테이너명 /bin/bash 컨테이너에 진입을 못했다. 켜져있을때 들어가도 다시 껏다켜지니까 빠져나와졌다. 그래서 대가리싸매고 고민하다가 docker cp로 컨테이너에 있는 my.cnf를 루트로 복사해서 문제가 됐던 설정부분을 삭제하고 다시 docker cp로 컨테이너에 집어넣었다 컨테이너에서 host로 docker cp 컨테이너id:/etc/mysql/my.cnf / host에서 컨테이너로 docker cp /my.cnf 컨테이너id:/etc/mysql

Naver Blog

윈도우에서 포트 죽이기

명령 프롬프트 (cmd) 관리자의 권한으로 오픈 명령어 netstat -a- o 해당하는 포트를 찾아서 pid에 주목한다 taskkill /f /pid 9156 나는 8080포트를 죽였따

Naver Blog

Vue.js 설치하기

환경설정 Vue.JS를 설치해보겠다. 우선 VSCode를 설치했다. https://code.visualstudio.com/ Visual Studio Code - Code Editing. Redefined Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. code.visualstudio.com node js를 설치한다 https://nodejs.org/ko/ Node.js Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org nodejs 설치가 완료되면 환경

Naver Blog

Vue.js 프로젝트 만들기

VSCode 터미널에서 vue create 프로젝트명 명령어를친다. Vue3 Vue2 둘의 선택하라는 말이 나오는데 키보드 방향키로 해당 버전을 선택하여 엔터를 치면된다 프로젝트가 만들어졌다. 폴더 위치는 터미널 실행 위치와 같다.

Naver Blog

template might not exist or might not be accessible by any of the configured template resolvers

ajax 사용 후 에러나옴.. $('#btn_hart').click(function(){ var param = { num:$("#num").val() }; $.ajax({ url:"/board/plusHart", type:"PUT", data:param }).done(function(){ }); }); 원인은 컨트롤러가 @Controller 였기때문이었다. @RestController였으면 컨트롤러 자체가 ResponseBody를 품고있어서 상관없는데 @Controller라서..;; @PutMapping("/plusHart") public @ResponseBody void HartPlus(@RequestParam Map<String,Object> param){ boardService.plusHart(Integer.parseInt(param.get("num").toString())); } 메소드 타입 앞에 @ResponseBody를 야무지게 넣어주면서 해결완료 요즘 고양이 한마리 키우

Naver Blog

Entity 테이블 대소문자 구분

application.properties에 아래 코드 추가 spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

Naver Blog

Open API Cors

OpenAPI 연동을 할 때 proxy Server가 제대로 구현되어 있지 않을때 에러가 나올 수 있다. 본인은 Open API를 연동할때 프록시 서버가 제대로 구현되어있었기 때문에 Cors 에러를 보지 못했다, 하지만 면접을 볼때 질문을 받았었기에 찾아보았다. Cors의 보통의 에러? Access to XMLHttpRequest at '~' from origin '~' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource 프록시서버가 없는 상황에서 OpenAPI를 연동해야할때 https://cors-anywhere.herokuapp.com/ 를 API 주소 앞에 적는다면 본인의 proxy server를 대체하여 사용할 수있다. SOP (Same-origin policy) SOP은 같은 Origin에만 요청을 보낼 수 있는 보안 정책을 의미함

Naver Blog

JAVA8과 JAVA11에 추가된 내용.

JDK8 변경사항 람담 표현식 - 함수형 프로그래밍 스트림 API (Stream API) - 데이터를 추상화하여 다룰 수 있음 java.time 패키지 - LocalDate 나즈혼 (Nashorn) - javascript 새로운 엔진 도입 Interface - 상수필드, 추상메서드,디폴트메서드 자동 타입변환 강제 타입변환 JAVA8은 람다와 스트림이 가장 큰 변환점. JDK11 변경사항 람다 파라미터를 지역변수로 표현 가능 HTTP Client - Non-Blocking request and response 지원 , Backpressure 지원, Rest Client에 RestTemplate 대신해 WebClient를 사용하여 비동기 구현가능. 모듈 메모리 관리 효율적으로 구성 - 캡슐화에 더 요긴해짐 통합로깅 오버헤드가 낮은 힙 프로파일링 가비지 수집 - G1GC 가비지 우선 가비지 수집기 Docker 컨테이너 향상된 기능 - 컨테이너에 설정된 메모리 및 CPU 제약 조건은 JVM

Naver Blog

@OneToMany, @ManyToOne

@OneToMany , @ManyToOne OneTOMany는 1:N 관계 쉽게 권한:user 라고 볼 수 있다 권한이 Member인 user는 여러명. ManyToOne은 N:1 관게. @OneToMany , @ManyToOne 속성 Optional - false로 설정할 시 해당 객체에 null 삽입 가능. ManyToOne , OneToOne : false = 내부조인 , true 외부조인 OneToMany, ManyToOne : false 외부조인, true 외부조인 cascade - 영속성 전이 - 부모 엔티티가 영속화 될 때 자식 엔티티도 같이 영속화되고, 부모 엔티티가 삭제될 때 자식 엔티티도 삭제되는 등 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 전이되는 것을 의미. - CascadeType.ALL : 모든 Cascade 적용 - CascadeType.PERSIST : 엔티티를 영속화 할 때, 연관된 엔티티도 함께 유지 - CascadeTyp

Naver Blog

docker container 로그 보기

docker logs --tail 50 --follow --timestamps 컨테이너명 docker mysql 컨테이너에 my.cnf 파일을 수정하고 해당 컨테이너를 리스타트했는데 계속 restarting 되었다. 이유가뭐지 왜 자꾸 혼자 껏다켜지지 로그를 보니.. 내가 my.cnf 파일을 잘못 수정해서 그런것이었다. 일단, 되돌려놓고..계속 찾아보자

Naver Blog

docker image , container

자꾸 까먹어서 정리 이미지 갖고오기 docker pull mysql (docker hub 로그인 되있어야함) docker run -d --name <컨테이너이름> <pid> docker exec -it pid /bin/bash

Naver Blog

AWS EC2 인스턴스 포트열기

공짜로 만든 서버에 포트를 열어보자 1. 인스턴스 화면에서 '보안' 탭에 들어간다. (아래에있음), 그러면 인스턴스의 보안그룹이 보인다 이부분 클릭의 파란색 부분을 클릭하여 상세에 들어간다. 2.아래에 인바운드 규칙편집을 클릭한다. 3. 규칙 추가를 누른 다음. 포트 범위를 작성한다 ex)8070, 8090 등 0.0.0.0은 모든 아이피의 접속을 허용한다는 의미이다. #AWS #EC2 #PORT오픈

Naver Blog

Docker 설치 및 기본적인 설정하기.

docker 설치 및 도커 그룹 사용자 추가 //도커 패키지 설치 sudo wget -qO- http://get.docker.com/ | sh //usermod 명령어로 현재 user를 docker 그룹에 추가 꼭해야함.. sudo usermod -aG docker $USER docker hub - docker image pull (도커 이미지 다운) https://hub.docker.com/ Docker Hub Container Image Library | App Containerization Docker Hub is the world's largest library and community for container images Browse over 100,000 container images from software vendors, open-source projects, and the community. Official Images Get Started Sign Up hub.d

Naver Blog

Dockerfile

Dockerfile - image build && 이미지를 작성하는 설정 파일 사용자가 원하늗대로 이미지를 만들 수 있도록 설정하는 파일. 사용자가 수동으로 했던 작업을 자동으로 할 수 있음. 물론 설정하기 나름 Dockerfile 명령어 Dokcerfile 명령어는 대문자로 적어야함. ex) 이런식으로 명령어는 대문자. FROM - Docker 베이스 이미지 지정 명령어. <image name>:<tag> 형식으로 작성 MAINTAINER - 메인테이너 정보 (만든사람 이름 박제 가능) RUN - Shell Script 또는 명령어 실행. LABEL - 라벨링 작성. 이미지 간략히 설명. CMD - RUN은 이미지 실행 설정이며 CMD는 컨테이너 실행 명령어. ENTRYPOINT - 컨테이너가 시작될때 실행되는 명령어.CMD보다 우선되기 때문에 CMD 명령어를 씹어버릴 수 있음. EXPOSE - 컨테이너 포트 개방 ENV - 환경변수를 설정할 수 있음. ADD -파일 또는 디렉토리

Naver Blog

Docker Compose

Docker Compose docker container를 모아서 관리하기. docker-compose version 이라고 치면 현재 docker-compose의 버전을 확인 해볼 수 있다. docker-compose는 .yml 확장자 파일을 만들어서 실행한다. 야멜이라고 부른다. #docker #compose version: "3.7" //버전을 필수로 적어줘야한다. services: app: # The app service definition // #은 주석을 의미한다. mysql: image: mysql:5.7 //이미지명 restart: always // 서버 리스타트할때 항상 리스타트된다. ports: - "3306:3306" //mysql 기본포트 docker Compsoe 실행은 보편적으로 docker-compse up 이미지 재빌드가 필요할 경우 docker-compose up --build docker compose 중지 docker-compose stop dock

Naver Blog

docker mysql 설치

docker-compsoe.yml version: "3" services: db: image: mysql:8.0.26 restart: always volumes: - ./mysqldb:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=123456789a - MYSQL_DATABASE=JISUNG2022 ports: - "3306:3306" 위 스크립트로 yml 파일을 만든 후 docker-compose up 해준다. mysql 들어가기 ubuntu@ip-172-35-35-35:~$ docker exec -it PID /bin/bash root@6632161d23ef:/# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 560 Server version: 8.0.26 MySQL Comm

Naver Blog

/Program Files/Java/jdk-11.0.9/bin/java.exe&apos;&apos; finished with non-zero exit value 1

Settings - Build,Excution..... - Gradle 에서 Build and run using과 Runtests using 을 IntelliJ IDEA 로 변경 #gradle #non-zero #

Naver Blog

[MYSQL]Access denied for user' user명'@'ip'

아마존 EC2 , mysql8.0.2.6 workbench에서는 접속이 잘 됐는데 인텔리제이에서만 접속이 안됐다 뭐가문제지. 고민끝에 여러가지 헛짓거리하다가 grant all privileges on 데이터베이스명 to '유저'@'%' with grant option; flush privileges; 기존에는 with grant option과 flush privileges; 를 안썻었다 저거 두개를 넣어서 다시 하니까 잘됐다. 하여튼 신기하다 인텔리제이에서만 접속이 안되다니.. #MYSQL #외부접근

Naver Blog

JpaRepository와 CRUDRepository

JpaRepository - JPA 관련 특화 기능들 + CrudRepository와 PagingAndSortingRepository 기능 CRUDRepository - CURD 관련 기능 상속관계

Naver Blog

[mysql] error code:1175

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. DELETE FROM BOARD; BOARD의 모든 데이터 열이 삭제가 안되었다. 이유는 SAFE MODE 였다. 물론 나는 SAFE MODE를 설정한적이 없다. 자동으로 되나보다.. 여튼 set sql_safe_updates=0; 위 명령어로 해결했다.

Naver Blog

textarea 데이터 표기

<div class="form-group"> <label for="content" class="col-sm-2 control-label">내용</label> <textarea id="content"class="form-control" name="content" rows="3" th:text="${data.content}"></textarea> </div> th:value 로 하면 값 안나오고 th:text로 하면 값나옴;;

Naver Blog

Singleton Pattern

Singleton Pattern 인스턴스: 속성과 기능을 가진것 중 실제하는 것 ex) 공장에서 시속 150km까지 달릴 수 있는 자동차가 나왔다. 위 문장에서 인스턴스는 '자동차' 하나만 생성해야할 객체를 위한 패턴 요구사항 개발중인 시스템에서 스피커에 접근 할 수 있는 클래스를 만들어 주세요. 구현 public class SystemSpeaker { static private SystemSpeaker instance; private int volume; public int getVolume() { return volume; } public void setVolume(int volume) { this.volume = volume; } private SystemSpeaker(){ volume=5; } public static SystemSpeaker getInstance(){ if(instance==null){ instance=new SystemSpeaker(); } return i

Naver Blog

Prototype Pattern

프로토타입 패턴 프로토타입 패턴을 통해 복잡한 인스턴스를 복사 생산 비용이 높은 인스턴스를 복사를 통해서 쉽게 생성 할 수 있도록 하는 패턴 생상비용이 높은 인스턴스란? 1. 종류가 너무 많아서 클래스로 정리되지 않는 경우 2. 클래스로부터 인스턴스 생성이 어려운 경우 요구사항 그림그리기 툴 개발 복사 붙여넣기 기능 구현하기. Shape.java public class Shape implements Cloneable{ private String id; public void setId(String id) { this.id = id; } public String getId() { return id; } } Clone.java public class Circle extends Shape { private int x,y,r; public Circle(int x, int y, int r){ super(); this.x=x; this.y=y; this.r=r; } public Circle co

Naver Blog

Builder Pattern 빌더패턴

Builder Pattern 빌더패턴 복잡한 단계가 필요한 인스턴스 생성을 빌더 패턴을 통해서 구현할 수 있다. 복잡한 단계를 거쳐야 생성되는 객체의 구현을 서브 클래스에게 넘겨주는 패턴 구현 BluePrint.java public abstract class BluePrint { abstract public void setCpu(); abstract public void setRam(); abstract public void setStorage(); public abstract Computer getComputer(); } LgGramBlueprint.java public class LgGramBlueprint extends BluePrint{ private Computer computer; public LgGramBlueprint(){ computer =new Computer("default","default","default"); } @Override public void set

Naver Blog

Builder Pattern -2 실무에서사용예시

Main public class Main { public static void main(String [] args) { // Computer computer = new Computer("i7","16G","256"); Computer computer = ComputerBuilder .start() .setCpu("i7") .setRam("16G") .setStorage("256G") .build(); } } Computer computer = new Computer("i7","16G","256"); 위 코드가 일반적으로 사용하는 코드이다 아래의 코드는 위 코드를 좀 더 가독성있게 만들어놓은 코드. 즉 Builder패턴이다. Computer.java public class Computer { private String cpu; private String ram; private String storage; @Override public String toString() { return "

Naver Blog

Abstract Factory Pattern

Abstract Factory Pattern 추상팩토리 패턴 생성 부분의 가상황/ 관련있는 객체 구현 BikeFactor interface package abst; public interface BikeFactory { public Body createBody(); public Wheel createWheel(); } Body Interface package abst; public interface Body { } Wheel interface package abst; public interface Wheel { } samBody.class package sam; import abst.Body; public class SamBody implements Body { } samfactory.class package sam; import abst.BikeFactory; import abst.Body; import abst.Wheel; public class SamFactory impleme

Naver Blog

AWS EC2 만들기

1. AWS를 가입하고 난 후 첫 화면이다. 우측 상단에 리젼을 '서울' 로 해야한다. 2.로그인 후 EC2를 검색하거나 솔루션 구축 -> 가상 머신 시작에 EC2 사용을 클릭한다. 3.Ubuntu Server 20.0.4 LTS를 선택한다. 4.'프리티어 사용 가능'을 선택한다. 5.30GB까지 무료이므로 크기를 30으로 설정한다. 6.인스턴스 보기를 클릭한다. 그뒤로도 계속 넘어간다(별로 의미없음) 7. 생성되었다. 8.왼쪽 메뉴에서 탄력적IP 주소 할당을 선택한다. IP를 할당받아야 아마존에 내 서버에 접속이 가능해진다. 9. 인스턴스에 내가 프리티어로 사용하고있는 서버를 선택한다. 10. 할당된 ip까지 확인된다면 서버는 받은거다. 서버를 만들고 나면 pem 확장자의 파일이 생긴다. 이건 putty로 아마존에 접속하기 위해 필요하므로 무조건 삭제하지말고 갖고 있어야한다. 절대 삭제하면 안된다.

Naver Blog

AWS EC2 서버 접속하는법 (윈도우)

1. PuTTY: a free SSH and Telnet client (greenend.org.uk) 페이지에 접속한다. 맨 상단에 Download it here 를 클릭한다. 2. puuty를 bit 형식에 맞게 다운로드 받는다. 3. puttygen 을 bit 형식에 맞게 다운로드받는다. ec2를 받으면서 받은 pem 확장자 파일을 ppk 확장자로 변환하기 위해 필요하다. 4.puttygen에 들어간 후 맨 아래 라디오버튼에서 RSA를 선택한다. 그리고 Load를 클릭한 후 EC2를 만들면서 생긴 pem 파일을 넣는다. 5. Save private key 버튼을 클릭하여 저장한다. 6.아래와 같은 ppk 파일이 만들어졌을것이다. 7.PUTTY를 열은다음 Host Name을 아래와 같이 적는다. 탄력적ip는 할당받은 ip를 넣어준다 8. 좌측의 SSH를 선택 후 Auth에 들어간다. Browser를 클릭한 후 puutygen을 통해 만든 ppk 확장자 파일을 넣는다. 8. 공짜로

Naver Blog

sudo apt-get update

linux 버전 업데이트 리다이렉션(redirection) 표준 스트림 흐름을 바꿔줌 명령어 표준 출력을 화면이 아닌 파일에 쓸때 사용 소프트(심볼릭) 링크 ln -s A B 일종의 바로가기 ls -al 할경우 소프트링크 확인 가능 A파일을 삭제시 B파일까지 접근 불가

Naver Blog

도커, 대체 왜 쓸까?

도커 왜 쓸까? 첫 회사 입사 후 한달정도 회사에서 프로젝트를 소소하게 수정,추가개발 하다가 파견을 가게됐다. 파견을 간곳에서 서버를 설치하게 되었다.. 물론 사수분께 배우면서.. 개발서버, 운영서버 중에 개발을 내가 설치하게 되었는데 개발환경은 1.우분투 2.도커 - oracle, tomcat...기타 등등 회사 패키지 3.젠킨스 4.nginx 설치를 완료하고 프로젝트를 개발하여 배포하는 과정에 서버가 자주 고장이났고 수정을 해줘야할때가 많았다. 그때마다 도커 컨테이너에 들어가야 했고.. 도커에 대해 큰 관심을 갖게되었다. 도커를 공부하면서 도커를 대체 왜쓸까?라는 물음이 돌아왔고, 사수분이 친절하게 얘기를 해주셨지만.. 솔직히 이해가 잘 되지 않았다. 나는 도커를 쓰기 전 환경을 잘 모르니까... 그런거 아닐까 전쟁을 겪은 세대와 전쟁을 겪지 않은세대..? (너무 갔다) 여튼 도커를 왜 쓸까? 1. 개발자가 만든 그대로 어디서든 돌아가게 된다. (하드웨어가 달라도 컨테이너 설정이

Naver Blog

https 란 무엇인가

https Hyper - Text Transfer Protocol Secure 기존의 http사이트보다 안전하다는 뜻 1.내가 다른곳에 보내는 정보를 다른 누군가가 훔쳐보지 못하게 함. 2.사이트가 믿을만한 곳인지 확인가능 ( 기관이 인증한 사이트만 https를 사용 가능하기 때문) ex) https://www.naver.com 과 http://www.naver.cm 둘은 다름. 네이버 네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요 www.naver.com 공개키 암호화 방식에는 공개키와 대칭키가 있다 대학생때 정보보안프로그래밍 수업을 들었던 기억이 갑자기 난다. 해쉬 알고리즘 써가며 대가리 깨질거 같았는.데..ㅋㅋ 간단히 말하면 대칭키는 평문을 암호화하는 키와 복호화하는 키가 똑같은 거다. 공개키는 평문을 암호화하는 공개키는 공개해버리고, 복호화하는 키는 혼자 아무도 모르게 갖고있는것이다. 클라이언트(사용자 ) - 서버(네이버) 가 있다고 할때. 1. 클라이언트는 정보

Naver Blog

Querydsl

Querydsl 설명 쿼리메소드나 @Query를 이용하는 경우에는 고정적인 쿼리만을 만든다. 동적인 상황에 대한 처리를 하려면 Querydsl을 이용해야 한다. Querydsl의 dsl은 'Domain Specific Language'의 약자로 특정 도메인 객체를 조회한다는 의미이다. 동적인 쿼리를 작성하는 방법은 Criteria라는 것도 있지만 Querydsl이 편리하다. Querydsl을 사용하기 위해서 라이브러리와 Maven 설정을 변경해야 한다. 스프링 데이터 JPA와 Querydsl 스프링 데이터 JPA가 Querydsl을 지원하는 방법은 2가지가 있다. - QuerydslPredicateExecutor를 상속 받는다. - QuerydslRepositorySupport를 상속받고 사용자 정의 레포지토리를 구현한다. Querydsl 지원 레포지토리 구현 public interface MemberRepository extends CrudRepository<Member,Long>

Naver Blog

Spring Data 사용자 정의 인터페이스

Spring Data 사용자 정의 인터페이스 @Query를 이용하는 방식은 JPQL의 내용이 고정적이라는 것이다. JPQL을 원하는 시점에 동적으로 처리할려면 사용자가 직접 Repository를 조절하는 방식으로 사용해야 한다. QuerydslPredicateExecutor를 이용하여 스프링 데이터 JPA에서 Querydsl을 사용할 수 있지만 join 기능 등을 사용 할 수 없다. 스프링 데이터 JPA가 제공하는 QuerydslRepositorySupport를 사용하려면 Querydsl이 제공하는 다양한 기능을 사용할 수 있다. 사용자 정의 인터페이스 구현 방법 1.원하는 기능을 하는 사용자 정의 인터페이스 설계한다. 2.엔티티 Repository 인터페이스는 사용자 정의 인터페이스를 상속하도록 한다. 3.Repository 이름 + Impl로 엔티티 Repository 인터페이스를 구현하는 클래스를 정의한다. 4.구현클래스는 QuerydslRepositorySupport를 부모클

Naver Blog

toString() , String.valueOf()

공통점 toString() ,String.valueOf() 둘 다 모두 Object를 String 형변환 해준다. 차이점 toString()은 변환한 값이 Null 일 경우 'NullPointException' 에러를 발생한다. String.valueOf()는 Null 또한 String으로 받아드려 "Null" 값을 출력한다. public static void main(String[] args) { HashMap<String,Object> map = new HashMap<>(); map.get("toString").toString(); } map.get("toString").toSring() 에서 걸려서 NPE 가 떳다. public static void main(String[] args) { HashMap<String,Object> map = new HashMap<>(); String vof=String.valueOf(map.get("String.valueOf")); System.

Naver Blog

[JAVA] XML 파싱 후 JSON 변환

java에서 xml 파싱 하는 방법. class Main { public String XMLParsing() throws Exception{ String output=""; try{ FileInputStream is = new FileInputStream("test.xml"); String xml = IOUtils.toString(is,"UTF-8"); JSONObject object = XML.toString(xml); ObjectMapper mapper = new ObjectMapper(); mapper.enable(SerializationFeature.INDENT_OUTPUT); Object json = mapper.readValue(object.toString(),Object.class); HashMap<String, Available> map = (HashMap<String, Available>) mapper.readValue(object.toString()); output

Naver Blog

HashMap) keyset,entryset,getordefault

keyset keyset은 HashMap에 key값만 필요한 경우 사용한다. for(char key:map.keySet()){ System.out.println(key); } key값만 출력할 수 있다. entrykey entrykey는 HashMap에 key,value 값을 둘 다 출력 할 수 있다. HashMap<String,String> map2 =new HashMap<>(); for(Map.Entry<String,String> entry: map.entrySet()){ System.out.println("key"entry.getKey() + "value" + entry.getValue()); } Map entry에 담긴다. getordefalut HashMap<Character,Integer> map =new HashMap<>(); for(char x : str.toCharArray()){ map.put(x,map.getOrDefault(x,0)); } map에 값이 있을경우

Naver Blog

Stratege Pattern 스트래티지 패턴

인터페이스 기능에 대한 선언과 구현 분리 public interface Ainterface { //기능에 대한 선언 public void funcA(); } public class AinterfaceImpl implements Ainterface { @Override public void funcA() { System.out.println("AA"); } } 기능을 사용 통로 public class Main { public static void main(String [] args){ Ainterface ainterface = new AinterfaceImpl(); //통로 ainterface.funcA(); } } 델리게이트 Deligate 위임하다 델리게이트 - 다른객체의 기능을 빌려서 사용하는것. public class AObj { public AObj(){ Ainterface ainterface= new AinterfaceImpl(); } public void funcAA(){

Naver Blog

java.io.File 메소드

java.io.File 인터페이스 연계를 하다보니, 자주 다뤘었는데.. 제대로 정리를 해보려고 한다. 자주 쓰는것들을.. 파일 내용이 아닌 파일 자체를 다룬다. (JSONObject, XML Mapper, FileInputStream 메소드를 이용하여 내용까지 다룰 수 있음) 공통코드 public class Main { public static void main(String[] args) { try { File file = new File("/home/File/read/test.txt"); File [] list = new File ("/home/File/read/test.txt"); if(file.exists()){ System.out.println("파일"); }else{ System.out.println("파일아님."); } } catch (Exception e) { System.out.println("파일 및 폴더 생성에 실패했습니다."); } } } boolean 타입 ex

Naver Blog

어댑터 패턴 Adapter Pattern

Adapter Pattern 어댑터 패턴 연관성 없는 두 객체 묶어 사용하기 사전적 의미의 Adapter - 기계, 기구 등을 다목적으로 사용하기 위한 부가 기구 요구사항 두 수에 대한 다음 연산을 수행하는 객체를 만들어 주세요. - 수의 두 배의 수를 반환 : twiceOf(Float):Float - 수의 반(1/2)의 수를 반환 : halfOf(Float):Float 구현 객체의 이름은 'Adapter'로 해주세요. Math 클래스에서 두 배와 절반을 구하는 함수는 이미 구현되어 있음 public interface Adapter { //원하는 기능 public Float twiceOf(Float f); //원하는 기능 public Float halfOf(Float f); } public class AdapterImpl implements Adapter { @Override public Float twiceOf(Float f) { return (Float) Math.doubled(

Naver Blog

템플릿 메소드 패턴 ( Template Method)

템플릿 메소드 패턴 ( Template Method) 공통적인 프로세스를 묵어주기 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의하는 패턴 언제 사용? 1.구현하려는 알고리즘이 일정한 프로세스가 있다. 2.구현하려는 알고리즘이 변경 가능성이 있다. 어떻게? 1.알고리즘을 여러 단계로 나눈다. 2.나눠진 알고리즘의 단계를 메소드로 선언한다. 3.알고리즘을 수행할 템플릿 메소드를 만든다. 4.하위 크래스에서 나눠진 메소드들을 구현한다. 요구사항 1.신작 게임 접속 구현하기 2.유저가 게임 접속시 고려 사항 - 보안 과정: 보안 관련부분 처리 - 인증 과정: user name과 password가 일치하는지 확인 - 권한 과정: 접속자가 유료회원인지 무료회원인지 게임 마스터인지 확인한다. - 접속 과정: 접속자에게 커넥션 정보를 넘겨준다. 구현 추상 클래스 AbstGameConnectHelper public abstract class Abst

Naver Blog

Factory Method 팩토리 메소드 패턴

Factory Method Pattern 구조와 구현의 분리를 이해하기. 팩토리 메소드 패턴 - 객체를 생성하기 위한 인터페이스 정의, 어떤 인스턴스를 만들지는 서브 클래스에서 결정 팩토리 추상 패턴 - 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상, 클래스를 지정하지 않고도 생성. 즉 클래스의 인스턴스를 만드는 일을 서브클래스에 맡김. 요구사항 게임 아이템과 아이템 생성 구현 - 아이템 생성 전 데이터베이스에서 아이템 정보를 요청 - 아이템 생성 후 아이템 복제 등의 불법을 방지하기 위해 데이터 베이스 아이템 생성 로그 남기기 아이템을 생성하는 주체를 ItemCreator로 명명 아이템은 item이라는 interface로 명명 - item은 use함수를 기본 함수로 갖고있기. 현재 아이템 종류는 체력물약, 마력물약. 구현 Item interface public interface Item { public void use(); } item abstract class p

Naver Blog

Controller Method Parameter

주요 매개변수 Model 이동 대상에 전달할 데이터를 가지고 있는 인터페이스 RedirectAttributes 리다이렉트 대상에 전달할 데이터를 가지고 있는 인터페이스 JavaBeans Class 요청 파라미터를 가지고 있는 자바빈즈 클래스 MultipartFile 멀티파트 요청을 사용해 업로드된 파일 정보를 가지고 있는 인터페이스 BidingResult 도메인 클래스의 입력값 검증 결과를 가지고 있는 인터페이스 java.util.Locale 클라이언트 로캘 java.security.Principal 클라이언트 인증을 위한 사용자 정보를 가지고 있는 인터페이스 * 컨트롤러 매개변수명 자바 소스를 컴파일할 때 -g 옵션(디버깅 정보를 출력하는 모드)을 사용해야 매개변수명을 인식 할 수 있다. 만약에 그럴 수 없다면 value(name)속성을 지정한 애너테이션(@RequestParam, @PathVariable)을 사용해야한다. 주요 애너테이션 @PathVariable URL에서 경로

Naver Blog

Date 타입 처리 @DateTimeFormat

기존 자바의 날짜와 시간 관련 클래스들의 문제점이 많아 새로 개선된 클래스(LocalDate,LocalDateTime 등)를 사용하다보면 기존 스프링에서 자동으로 문자열에서 Date타입으로 변환되던 것이 더 이상 가능하지 않다는 것을 알게된다. 이를 해결하기 위해서는 스프링의 데이터 타입 변환 매커니즘을 이용하거나 @DataTimeFormat을 사용하는 것이다 @DateTimeFormat 애너테이션 *사견 내가 다니는 회사의경우 Date타입은 대부분 쿼리에서 처리. <a:th:href="@{registerByGet01?userId=hongkd&dateOfBirth=20180908}"> registerByGet01?userId=hongkd&amp;dateOfBirth=20180908</a> <br> @GetMapping("/registerByGet01") public String registerByGet01(String userId,@DateTimeFormat(pattern="yyyy

Naver Blog

&lt;option&gt; 값 for문 돌려서 뽑기

<form th:action="@{/registerMultipleSelect}" method="post"> carArray<select name="carArray"multiple> <option value="volvo">volvo</option> <option value="saab">saab</option> <option value="opel">Opel</option> <option value="Audi">Audi</option> <input type="submit" value="registerMultipleSelect02"> </form> @PostMapping("/registerMultipleSelect02") public String registerMultipleSelect02(String[] carArray){ for(int i=0; i<carArray.length; i++){ log.info(carArray[i]); }

Naver Blog

01_타임리프란?

타임리프 타임리프(Thymeleaf)는 자바 라이브러리이며, 웹과 웹이 아닌 환경 양쪽에서 텍스트, HTML,XML,javascript,CSS 그리고 텍스트를 생성할 수 있는 템플릿 엔진이다. 웹 애플리케이션에서는 뷰(view) 계층에 적합하지만, 오프라인 환경에서 많은 형태로 처리가 가능한다. 주요기능 - XML, XHTML 그리고 HTML5를 위한 자바 템플릿 엔진이다. 다른 템플릿 포맷으로 확장이 가능. - 웹과 오프라인 양쪽 환경에서 동작, 서블릿, API에 대한 강한 의존성이 없다. - 다이얼렉트(dialect)라고 불리는 기능 셋 모듈을 기반으로 한다. - 다양한 템플릿 모드(XML,XHTML,HTML5)를 제공한다. - 완벽한(그리고 확장가능한) 국제화를 지원한다. 구현 <!--타임리프가 사용된다는 것을 나타낸다.--> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Home</title> <meta http-equi

Naver Blog

JPA

JPA - Java Persistence API 자바 표준 ORM Object-Relational Mapping, Object-Relational Mapper JPA 흐름도 JPA 요소 Entity - 데이터베이스에서 지속적으로 젖아된 데이터를 자바 객체에 매핑한 것. - 메모리 상에 자바 객체의 인스턴스 형태로 존재하며 EntityManager에 의해 데이터베이스의 데이터와 동기화된다. Entity Manager - 필요에 따라 Entity와 데이터베이스의 데이터를 동기화한다. - EntityManager에서 제공하는 Entity 조작 API를 이용해 Entiy에 대해 CRUD 작업을 한다. 영속성 컨텍스트(persistence context) - Entity를 영구적으로 저장하는 환경이다 - Entity를 저장하거나 검색할 때 Entity Manager는 영속성 컨텍스트에서 Entity를 저장하고 관리한다. - Entity Manager를 생성할 때 영속성 컨텍스트가 만들어진다.

Naver Blog

Spring Data JPA

Spring Data JPA는 Spring에서 JPA라는 기술을 사용하는 데 도움이 되는 라이브러리이다. CrudRepository 인터페이스 public interface CrudRepository<T,ID> extends Repository<T,ID> 메서드 설명 long count() 사용 가능한 엔티티 수를 반환한다. void delete(T entity) 주어진 엔티티를 삭제한다 void deleteAll() 저장소에서 관리하는 모든 에티티를 삭제한다. void deleteAll(Iterable<?extends T> entities) 주어진 엔티티를 삭제한다. void deleteById(ID id) 주어진 ID를 가진 엔티티를 삭제한다. boolean existsById(ID id) 주어진 ID를 가진 엔티티가 존재하는지 여부를 반환한다. Iterable<T> findAll() T타입의 모든 인스턴스를 반환한다. Iterable<T> findAllById(Iterable<

Naver Blog

쿼리메서드

Spring Data JPA는 메서드의 이름만으로 원하는 query를 실행 할 수 있는 방법을 제공한다. find...By read...By query...By get...By count...By public List findByUserId(String userId); public List findByUserIdAndUserPw(String userId,String userPw); public Colletion findBy userNoGreaterThan(Long userNo); 쿼리 메서드 지원 키워드 And findByLastnameAndFirstname Whre x.lastname= 1 and x.firstname 2 Or findByLastnameOrFirstname where x.lastname = 1 or x.firstname =2 Is Equals findByFirstname,findByFirstnameIs, findByFirstnameEquals where x.firs

Naver Blog

JPQL (Java Persistence Query Language)

JPQL(Java Persistence Query Language)은 JPA에서 사용하는 객체지향 쿼리 언어이다. 데이터베이스 SQL 쿼리 언어와 유사하지만 테이블과 컬럼 이름 대신 매핑한 엔티티 이름과 속성 이름을 사용한다. 객체지향 쿼리 데이터베이스 테이블 대상이 아닌 엔티티 객체를 대상으로 하여 여러 검색 조건을 사용하여 엔티티 객체를 조회할 수 있는 쿼리이다. - JPQL : 엔티티 객체를 조회하는 객체지향 쿼리 - Criteria 쿼리 : JPQL을 편하게 작성하도록 도와주는 빌더 클래스 제공 - Query DSL : Criteria 쿼리와 비슷한 기능을 하지만 비표준 오픈소스 프레임워크 -네이티브 SQL : JPQ에서 SQL을 직접 사용할 수 있다. Repository 인터페이스 선언 public interface MemberRepository extends CrudRepository<Member,Long>{ @Query("SELECT m FROM MEMBER m WHER

Naver Blog

JQuery 다운

https://cdnjs.com/libraries/jquery/1.12.4 jquery - cdnjs.com - The best FOSS CDN for web related libraries to speed up your websites! jquery - JavaScript library for DOM operations - cdnjs.com - The best FOSS CDN for web related libraries to speed up your websites! cdnjs.com https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.js 로 들어간다. 그리고 ctrl + s를 눌러 웹페이 자체를 저장한다. 그후 프로젝트중인 파일 갖다놓고 url 주소로 연동하여 사용

Naver Blog

나 블로거야

웹개발자가 되려는 블로거입니다. 스프링, 데이터베이스, 자바스크립트 위주로 글 올라가요~ #나블로거야

Naver Blog

[노량진 맛집] 향원 중화요리

6천원 탕수육정식 간단히 먹을만하다. 탕수육 짜장면 볶음밥까지 먹을 수 있다. 여긴 짜장면이 맛있다 #노량진 #향원중화요리 #향원 #탕수육정식 #노량진짜장면맛집

Naver Blog

맛집 게시글을 쓰는이유

광고는 절대 아니다. 그냥 내 모든것을 기록하기 위해.

Naver Blog

피자마루 성대시장점

피자마루 성대시장점 서울특별시 동작구 성대로 30 온정교회 피자마루 성대시장점이다 배민이랑 요기요로 배달도 하는거같은데 배민으로 배달시키려고 가격을 봤을때 일반 전화 포장보다 훨씬 비쌋다. 그래서 나는 전화해서 시켰고 주문이 밀렸는지 30분이따 오라고 했다. 그리고 30분에 얼추 맞춰서 갔는데도 5분정도 더 기다렸다 그러나!!!! 존나맛있따 허허허허허허허ㅓㅎㅎ 또먹고싶다 결론) 피자는 존나 맛있고 배민으로 시키면 전화방문포장보다 7천원정도 더비싸다(배달비별도) #피자마루 #성대시장점 #피자 #페퍼로니치즈폭탄피자 #치즈폭탄피자500g

Naver Blog

HTTP (Hyper Text Transfer Protocol)

HTTP (Hyper Text Transfer Protocol) HTML,TEXT, IMAGE,음성,영상,파일, JSON,XML(API) 등 거의 모든 형태의 데이터 전송 가능. 서버간에 데이터를 주고 받을 때는 대부분 HTTP 사용 HTTP/1.1 1997년, 가장많이 사용, 우리에게 가장 중요한 버전, 대부분의 모든 기능이 1.1에서 생김 TCP사용 RFC2068(1997) --> RFC2616(1999) --> RFC7230~7235(2014) HTTP/2 2015년, 성능개선 TCP사용 HTTP/3 진행중 : TCP 대신 UDP 사용, 성능 개선 HTTP 특징 클라이언트 - 서버 구조 무상태 프로토콜(스테이스리스),비연결 HTTP 메시지 단순함, 확장가능 클라이언트 서버 구조 Request Response 구조 클라이언트는 서버에 요청을 보내고, 응답을 대기 서버가 요청에 대한 결과를 만들어서 응답 예전에는 클라이언트- 서버라는 개념이 아닌 통으로 하나의 구조였으나 클라이언트

Naver Blog

HTTP 메서드

HTTP메서드 기본 리소스와 행위를 분리 가장 중요한것은 리소스를 식별하는 것, URI는 리소스만 식별 -리소스와 해당 리소스를 대상으로 하는 행위를 분리 리소스:회원 행위:조회,등록,삭제,변경 GET:리소스 조회 POST:요청데이터 처리, 주로 등록에 사용 PUT: 리소스를 대체, 해당 리소스가 없으면 생성 PATCH: 리소스 부분 변경 DELETE: 리소스 삭제 POST 요청 데이터 처리 메시지 바디를 통해 서버로 요청 데이터 전달 서버는 요청 데이터를 처리 - 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용. POST/members HTTP/1.1 Content-Type:application/json { "username":"hello", "age":20 } 즉 1. 새 리소스 생성(등록) 2.요청 데이터 처리 - 단순히 데이터를 생성, 변경하는것을 넘어서 프로세스를 처리. ex) 결제 -> 배달

Naver Blog

HTTP 메서드 활용

클라이언트에서 서버로 데이터 전송 쿼리 파라미터를 통한 데이터 전송 - GET - 주로 정렬 필터(검색어) 메시지 바디를 통한 데이터 전송 - POST, PUT,PATCH - 회원가입, 상품 주문, 리소스 등록, 리소스 변경 4가지 상황 1. 정적 데이터 조회 (GET) - 이미지, 정적 텍스트 문서 - 조회는 GET 사용, 정적 데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회 가능. 2.동적 데이터 조회 - 주로 검색, 게시판 목록에서 정렬 필터(검색어) - 조회는 GET 사용 -GET은 쿼리 파라미터 사용해서 데이터를 전달 (권장하지않음) 3.HTML Form을 통한 데이터 전송 - 회원 가입, 상품 주문, 데이터 변경 - POST 사용 4.HTTP API를 통한 데이터 전송 - 회원가입, 상품주문, 데이터 변경 - 서버 to 서버, 앱 클라이언트, 웹 클라이언트(Ajax) HTML form 태그 데이터 전송 HTML form submit시 POST전송 - 회

1 2 3