분류 전체보기 87

getter,setter

어차피 게터 세터로 프라이빗 데이터를 꺼내오고 조작할 수 있다면 그냥 Public으로 접근제어자를 지정하는게 좋지 않을까 생각할 수 있다. getter,setter Method를 사용하는 이유를 알아보자 멤버 변수를 저장하지 않고 필요할 때 마다 getter에서 계산이 가능하다. ex) 질량과 중력 멤버 변수를 계산하여 무게라는 값을 구할 수 있다. setter에서 추가적인 로직을 실행할 수 있다. ex) 나이라는 필드값 setting 시 음수 값이 들어올 경우 무시하는 로직을 짠다. 상속을 통해 다형성 구현 가능 멤버 변수는 그냥 앵간하면 Private으로 가자. 정보 숨기기를 통하여 캡슐화 진행. 또한 getter는 자유롭게 설정하되, setter는 충분히 고민 후 사용하도록 하자. 아무생각없이 게터..

공부/OOP 2023.12.13

OOP의 특성

1.캡슐화. 데이터와 그 데이터에 작용하는 메서드를 하나로 묶음 정보 숨기기: 개체안에 있는 데이터를 외부로부터보호 외부: 다른 클래스에 속한 객체들 2.상속 이미 존재하는 개체를 기반으로 확장된 개체를 만드는 방법 기존의 개체에 속한 데이터와 동작을 모두 물려받음 여기에 다른 데이터나 동작을 추가할 수 있음. 실용적인 용도: 코드 중복을 막음 3.다형성 OOP의 핵심 같은 지시를 내렸는데 다른 종류의 개체가 동작을 달리하는것. 같은지시: 동일한 함수 시그니처 호출 달리 동작: 개체의 동작에따라 실행되는 함수 구현 코드가 다름. 어떤 함수 구현이 실행될지는 실행중에 결정됨 다형성의 혜택을 받으려면 상속 관계가 필요. 실용적 용도: 부모의 형을 저장하는 배열에 모든 자식 객체를 저장. Animal[] 배열..

공부/OOP 2023.12.13

객체지향 프로그래밍의 필요성

절차지향 언어에서 사용하는 구조체(Struct)의 단점을 보완하기위해 객체지향 프로그래밍이 사용된다. 우선 구조체의 단점을 알아보자 구조체와 구조체 데이터의 동작을 담당하는 메서드 서로가 분리 되어있다. struct Human{ int age; float height; } void Walk(Human* human){ } // 절차지향언어인 C의 struct는 이렇게 데이터와 동작이 분리되어있다. 데이터와 각각의 동작을 일일히 찾아봐야하기때문에 코드가 복잡해진다. 이렇게 구조체안에 함수까지 담기위한 고민들속에서 객체지향 언어가 태어났다. OOP(Object Oriented Programming) 객체는 상태(속성)를 가질뿐만 아니라 동작도 할 수 있다. 프로그램을 구성하는 기본 요소를 객체로 보려는 노력...

공부/OOP 2023.12.13

QueryDSL No Property Error

QueryDSL 로 게시판 페이징처리 구현중 에러가 발생했다. CustomRepositroy를 구현한 메서드를 찾을수 없어 DI 오류가 발생... 분명히 깔끔하게 구현했는데 왜 문제일까 No Property 관련해서 구글링.. 결론은 좀 허무했다... QueryDSL 에서 CustomRepository와 impl은 '{Entity명}RepositoryImpl' 이라는 규칙에 맞게 생성되야하는데 Entity 명이 Posts인데 PostRempositoryImpl 로 구현해 구현체의 메서드를 찾을 수 없게된것이다... 리네임하고 테스트를 돌려봤더니 정상적으로 페이징처리됬다

Error 2023.12.12

4장 주석

‘나쁜 코드에 주석을 달지 마라, 새로 짜라’ 오래되고 조잡한 주석은 거짓과 잘못된 정보를 퍼트린다. 애초에 주석이 존재하는것 자체가 코드의 품질이 나쁘고 복잡하다. //직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if((employee.flags & HOURLY_FLAG) && (employee.age > 65)){ //TODO } 이 코드보다, if(employee.isEligibleForFullBenenfits()){ //TODO } 주석이 없는 두번째 코드가 더 의도를 파악하기 쉽다. 좋은주석 나쁜주석을 떠나 결국…. 주석은 확실히 코드만으로 의도를 설명하기 어려운 경우 에만 사용하자. 좋은주석 법적인 주석 저작권 정보와 소유권정보 정보를 제공하는 주석 데이터 포맷 형식 시각과 날짜 등등…..

책/CleanCode 2023.12.11

3장 함수

함수는 작게 만들자 블록과 들여 쓰기 if문, else문, while문 등이 들어가는 블럭은 한 줄이어야 한다. 함수안에서 여러가지 작은함수들을 호출한다면 호출된 함수명들을 통해 함수를 이해하기 쉬워진다. 중첩 구조가 생길만큼 함수가 커져서는 안된다. 한가지만 하자 한 가지 목적을 잘 처리하는 함수를 만들자 여러 목적을 가진 함수를 읽는것은 그 함수의 의도를 파악하기 어려워진다. 함수가 한가지 로직만 처리하는지 알 수 있는 방법 함수 코드중 어떠한 의미있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 함수다. 서술적인 이름을 사용하자 함수가 맡은 일을 잘 표현하는 이름을 사용하자 이름만 읽고도 그 함수가 어떤 기능을 수행하는지 짐작할 수 있는 이름을 짓자 이름이 길어도 괜찮다. 겁..

책/CleanCode 2023.12.08

테스트 환경에서 Cookie를 다루거나 검증해야할때

로그인시에 쿠키를 가져와 세션값을 검증해 사용자의 권한을 검증하는 테스트 케이스를 작성중 쿠키가 Null로 응답되는 문제가 발생했다. 분명히 PostMan에서는 쿠키가 정상적으로 유저에게 응답값으로 넘겨가졌는데 테스트만 돌리며 쿠키가 null이라고 에러가 떴다... 디버깅을해봐도 Cookie가 null로 나오는상황 andDo(print()); 를 이용해 로그인시에 request, response가 어떻게 내려오는지 확인해봤다. 응답값을 확인해보니 뭔가 다른점을 발견. 쿠키 객체의 이름이 그냥 Cookie가 아닌 MockCookie 임을 발견했다. 찾아보니 Junit 테스트 환경에서는 브라우저상에서 쿠키를 다루는것과 달라 따로 쿠키를 추출해 필요한 mockRequest에 심어줘야했다. 처음엔 andRetu..

Error 2023.12.08

1장 깨끗한 코드 , 2장 의미 있는 이름

깨끗한 코드란? 중복을 피한 코드 한 기능만을 수행하는 코드 명확하게 표현하는 코드 작게 추상화한 코드 짐작했던 기능이 그대로 수행되는 코드 의미 있는 이름 의도한 분명한 이름을 짓자. 수행기능, 사용방법 등… 만약 주석이 필요하다면 이름만으로 의도를 드러내지 못했다는 것. 예약어를 사용하지말자 ex) 여러 계정을 그룹으로 묶을때, accountList → 프로그래머에게 List는 자료구조를 의미하는 특수한 의미 accountGroup, bunchOfAccount, Accounts 등으로 명명하자. 실제 해당 자료구조 컨테이너가 List더라도 변수 이름에 List는 피하자. 서로 흡사한 이름을 사용하지 말자. 읽기에 명확한 단어로 적기 Bad ex) int a = l; if( O == l) a = o1;..

책/CleanCode 2023.12.07

스프링 이미지 출력 문제

1. 이미지 업로드를 static 폴더에 저장함. 2. 업로드한 이미지를 다시 출력하려니 저장된 이미지를 스프링 서버에서 찾을 수 없다고 404 에러가 발생함. 3. 문제는 static 폴더에 저장되는 이미지 파일들은 서버가 시작되고 refresh되지않아 서버가 시작되고 그 후에 업로드된 이미지들은 스프링에서 찾지 못함. 4.addResourceHandler를 이용해 외부 리소스 인식에 성공시킴.

Error 2023.10.06